Есть ли проблемы с использованием self.property = nil в dealloc? - PullRequest
9 голосов
/ 11 апреля 2011

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

Я обнаружил, что многие люди используют self.property = nil в их dealloc методе.

1) В документе Apple Управление памятью , стр. 23 Там написано:

Единственные места, где вы не должны использовать методы доступа для установки переменной экземпляра, это методы init и dealloc.

почему бы и нет?

2) В яблочном Objective-C 2.0 , p74

Объявленные свойства принципиально заменяют объявления методов доступа; когда вы синтезируете свойство, компилятор создает только любые отсутствующие методы доступа. Прямого взаимодействия с методом dealloc нет - свойства не освобождаются автоматически. Однако объявленные свойства предоставляют полезный способ перекрестной проверки реализации вашего метода dealloc: вы можете найти все объявления свойств в заголовочном файле и убедиться, что свойства объекта, не помеченные assign, освобождены, и помеченные assign не освобождаются.

Примечание: Как правило, в методе dealloc вы должны release переменные экземпляра объекта напрямую (вместо вызова метода доступа set и передачи nil в качестве параметра), как показано в этом примере:

- (void)dealloc { [property release]; [super dealloc]; }

Если вы используете современную среду выполнения и синтезируете переменную экземпляра, вы не можете напрямую получить доступ к переменной экземпляра, поэтому вы должны вызвать метод доступа:

- (void)dealloc { [self setProperty:nil]; [super dealloc]; }

Что означает примечание?

Я нашел [property release]; и [self setProperty:nil]; обе работы.

1 Ответ

9 голосов
/ 11 апреля 2011

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

Обратите внимание, что проблема такого рода возникает только в определенных случаях, поэтому часто вполне возможно написать код, используя self.property=nil в dealloc и все работает нормально. Это просто не лучшая практика.

В Objective-C "современная среда выполнения" можно объявлять свойства, даже не задавая ivar. Среда выполнения синтезирует хранилище в соответствии с синтезированными средствами доступа. В этом случае вы не можете выпустить ivar напрямую, потому что в вашем коде его нет. Таким образом, у вас нет выбора, кроме как пойти по маршруту self.property=nil.

...