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