Каждый объект имеет счетчик ссылок. Когда он становится равным 0, объект освобождается.
Предполагается, что свойство было объявлено как @property (retain)
:
Ваш первый пример, строка за строкой:
- Объект создан
alloc
, он имеет счетчик ссылок 1.
- Объект передается методу
self
setAController:
, который отправляет ему сообщение retain
(поскольку метод не знает, откуда поступает объект), увеличивая счетчик ссылок до 2.
- Вызывающему коду больше не нужен сам объект, поэтому он вызывает
release
, уменьшая счетчик ссылок до 1.
Ваш второй пример в основном выполняет шаги 1 и 2, но не 3, поэтому в конце счетчик ссылок на объект равен 2.
Правило таково: если вы создаете объект, вы несете ответственность за его освобождение, когда закончите с ним. В вашем примере код выполняется с помощью tempAController после установки свойства. Ответственность за вызов метода retain
лежит на методе setter.
Важно помнить, что self.property = foo;
в Objective-C действительно является просто сокращением для [self setProperty:foo];
и что метод setProperty:
будет сохранять или копировать объекты по мере необходимости.
Если бы свойство было объявлено @property (copy)
, то объект был бы скопирован, а не сохранен. В первом примере исходный объект будет выпущен сразу же; во втором примере счетчик ссылок исходного объекта будет равен 1, даже если он равен 0. Таким образом, вы все равно захотите написать свой код таким же образом.
Если свойство было объявлено @property (assign)
, то self
не претендует на право собственности на объект, и кто-то еще должен его сохранить. В этом случае первый пример будет неверным. Такие свойства встречаются редко, обычно используются только для делегатов объектов.