Синтаксис Objective-C @synthesize

Поскольку я относительно новичок в программировании приложений для iOS, я считаю очень полезным начать с некоторого примера кода. Таким образом, у меня получился файл .m, который начинается с некоторых строк, которые выглядят как

@synthesize valueOne= _valueOne;

Я заметил, что наличие такого синтаксиса делает невозможным программную установку свойств valueOne, например, выполнение таких действий, как

valueOne.tag = 3

Поэтому для своих целей я закомментировал часть "= _valueOne" без какого-либо заметного ущерба для функциональности кода.

Каково значение такого синтаксиса и что автор моего примера кода решил использовать его?

заранее спасибо


person Sjakelien    schedule 01.03.2013    source источник
comment
Я действительно сначала попытался найти ответ. Проблема в том, что это сложно сформулировать так, как это умеет Google ...   -  person Sjakelien    schedule 02.03.2013
comment
Нет, это не так: stackoverflow.com/search?q=objective-c+underscore+synthesize Фактически, некоторые из этих вопросов возникли бы в предложениях до того, как вы разместите это.   -  person jscs    schedule 02.03.2013
comment
@Sjakelien По мере того, как вы вводите свой вопрос, SO показывает вам список возможных связанных вопросов. Многие из тех, кто появляется с вашим вопросом, отвечают на ваш вопрос.   -  person rmaddy    schedule 02.03.2013
comment
Спасибо, теперь я вижу их в списке справа. Я уделю этому больше внимания.   -  person Sjakelien    schedule 02.03.2013


Ответы (1)


Этот синтаксис синтезирует резервный ivar для valueOne под именем _valueOne. Вы можете просто написать свой код так, чтобы он выглядел как

_valueOne.tag = 3;

Тем не менее, обычно считается, что лучше использовать методы доступа к свойствам, когда это возможно, поэтому вы обычно пишете это как

self.valueOne.tag = 3;

Заметные исключения из этого - когда вы находитесь в -init, -dealloc или в вашем собственном геттере / сеттере, вы по-прежнему хотите использовать ivar напрямую.


Использование префикса подчеркивания в именах ivar обычно считается хорошей практикой, потому что это означает, что если вы напишете valueOne.tag = 3; и вы намеревались использовать свойство, вы получите ошибку компилятора вместо тихого использования ivar. Если вы собираетесь использовать ivar, вы можете просто использовать префикс подчеркивания как _valueOne.tag = 3;.

Это настолько распространенная практика, что при автосинтезе современного clang будет использоваться стиль подчеркивания в начале для ivars. Это означает, что если вы удалите строку @synthesize полностью, она будет вести себя так, как если бы у вас было @synthesize valueOne = _valueOne;.

person Lily Ballard    schedule 01.03.2013
comment
Спасибо, это было очень полезно. - person Sjakelien; 02.03.2013
comment
Неужели нам нужен еще один ответ на этот вопрос? - person jscs; 02.03.2013