методы установки и получения - PullRequest
1 голос
/ 19 сентября 2010

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

В некоторых местах вам нужно использовать self.property вместо просто свойства, чтобы использовать методы setter и getter, например, в dealloc и initWithCoder.

Это говорит мне о том, что эти методы setter и getter делают что-то еще важное, помимо того, что вам проще установить и получить переменную. Что они делают и как они это делают?

Ответы [ 3 ]

5 голосов
/ 19 сентября 2010

Они делают все, что вы им сказали в выражении @property или в вашей собственной реализации, если вы решили написать их.Чаще всего причина использования средств доступа, а не прямого изменения переменных экземпляра, заключается в том, чтобы избежать утечек памяти.Представьте себе переменную экземпляра NSString, объявленную с

@property (nonatomic, retain) NSString *myString;
@synthesize myString;

. Эти строки генерируют метод доступа, который корректно вызывает release и retain, когда вы хотите изменить свойство myString объекта.Если вы не вызывали метод доступа, вы могли бы потенциально утратить старое значение, если только вы не были осторожны при управлении памятью самостоятельно.

3 голосов
/ 19 сентября 2010

Ваша базовая заповедь:

Есть определенные места, где вы должны использовать self.property вместо просто свойство, чтобы использовать методы setter и getter, такие как в dealloc и initWithCoder.

Это говорит мне, что эти методы установки и получения что-то делают еще это важно ...

не совсем правильно. Разница здесь в том, что использование self.propertyname специально вызывает метод получения / установки, когда он используется в этом классе, тогда как непосредственное использование свойства name - он напрямую обращается к переменным экземпляра.

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

2 голосов
/ 19 сентября 2010

Я второй, что сказали @heckj и @Carl, но должен добавить еще одно замечание.

В общем случае не безопасно использовать аксессоры в init или dealloc. Проблема в том, что ваш класс может быть разделен на подклассы, методы доступа могут быть переопределены. Тогда эти средства доступа могут получить доступ к другим свойствам вашего класса или подкласса. Это может привести к сбоям:

  • В случае init они еще не были инициализированы (потому что в init первый вызов, который вы делаете - [super init]).
  • В случае dealloc они уже были освобождены (потому что в dealloc последний вызов, который вы делаете - [super dealloc]).

На практике вы можете использовать средства доступа в init и dealloc. Под двумя предпосылками:

  • Вы знаете, что делаете. (см. выше)
  • Вы управляете всем, возможно, наследующим кодом. (не распространяется на фреймворки и т. д.)
...