Когда обращаться к свойствам с помощью «себя» - PullRequest
7 голосов
/ 25 ноября 2010

Я прочитал несколько вопросов на этом сайте об этой проблеме, я понимаю следующее:

self.property обращается к методу получения / установки, созданному вручную или с помощью @synthesize. В зависимости от того, объявлено ли свойство как сохранение, копирование и т. Д., Счетчик хранения корректно изменяется, например, сохраняемое свойство, освобождает предыдущее значение, которому присвоено новое значение, с помощью функции «сохранить» и увеличивает счетчик хранения на 1.

Свойства обычно объявляются с переменными экземпляра с тем же именем (могут отличаться, если вы делаете назначение вручную). Обычно это происходит потому, что сгенерированные средства доступа @synthesize используют переменную экземпляра для ссылки на объект в памяти, а затем выполняют соответствующие команды.

Мой вопрос основан на том факте, что во многих примерах self.property и property взаимозаменяемо используются для разных вещей, и у меня возникают проблемы с определением правил. Один из примеров в примере приложения «Рецепты» в Apple Docs имеет следующее:

self.navigationItem.title = recipe.name;
nameTextField.text = recipe.name;    
overviewTextField.text = recipe.overview;    
prepTimeTextField.text = recipe.prepTime; 

и ...

self.ingredients = sortedIngredients;

Каждое из этих свойств имеет связанные частные переменные экземпляра с тем же именем. Все они объявляются одинаково с атрибутами «nonatomic, retain». Каждый выпущен в dealloc ...

Тем не менее, к «ингредиентам» обращаются через себя, а «prepTimeTextField» - напрямую.

В чем причина различий в методах доступа?

Что если я получу доступ к представителю представления? Или объект основных данных, который был передан контроллеру представления его предыдущим контроллером представления как сохраненное свойство?

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 25 ноября 2010

вы почти всегда хотите получить доступ к переменным с помощью синтезированных сеттеров / геттеров, даже если в настоящее время вы не делаете с ними ничего особенного.

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

Обычно это хорошая привычка.

1 голос
/ 25 ноября 2010

Если вы объявите свою собственность так:

@property (nonatomic, retain) NSMutableArray *myArray;

Сгенерированный установщик автоматически сохранит переданное значение. Вот почему вы иногда увидите это в примере кода Apple:

self.myArray= [[NSMutableArray alloc] init]:
[self.myArray release];

"[self.myArray release]" требуется, потому что счетчик сохранения равен двум после первой строки. Освобождение этого гарантирует, что это до 1 (где это должно быть).

Если я просто использую автоматически сгенерированные сеттеры, я не буду использовать их при работе изнутри класса. Мне просто гораздо проще:

myArray = [[NSMutableArray alloc] init];

против. пример выше.

Мои два цента.

0 голосов
/ 25 ноября 2010

Зависит.Если переменные вашего экземпляра тупые, то к ним можно обращаться напрямую.Но причина, по которой большинству из нас нравится получать доступ к членам через свойства, заключается в том, что мы можем что-то изменить в логике этого члена, и все будет работать.

Например, иногда вы захотите изменить класс назагружать что-то лениво, а не сразу.Если вы уже используете свойства для доступа к переменной экземпляра, то вы можете просто отредактировать метод доступа, и все должно работать.

...