Что делает @property (retain)? - PullRequest
       31

Что делает @property (retain)?

0 голосов
/ 15 июня 2011

Что делает @propert (retain)?это фактически не сохраняет мой объект в моих тестах:

id obj = getObjectSomehow();
NSLog(@"%d", [obj retainCount]);
propertyWithRetain = obj;
NSLog(@"%d", [obj retainCount]);

// output:
// 1
// 1

Как я могу создать свойство, которое действительно сохранит объект?

Ответы [ 2 ]

5 голосов
/ 15 июня 2011

Вы не используете свою собственность там, поэтому она не удерживает!

Попробуйте это:

id obj = getObjectSomehow();
NSLog(@"%d", [obj retainCount]);
self.propertyWithRetain = obj; // Note the self. :)
NSLog(@"%d", [obj retainCount]);

Использование self. будет использовать свойство. Просто использование имени переменной не будет.


РЕДАКТИРОВАТЬ специально для @bbum (который поднимает очень справедливый вопрос в комментариях)

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

2 голосов
/ 15 июня 2011
propertyWithRetain = obj;

Это просто устанавливает ivar, напрямую поддерживающий свойство.Когда @property синтезируется, если не объявлена ​​переменная экземпляра, она генерируется автоматически.Выше приведено непосредственное использование этого ивара.

self.propertyWithRetain = obj;

Это на самом деле пройдет через установщик @synthesize d и увеличит счет сохранения.

Именно поэтому многие из нас используют @synthesize propertyWithRetain = propertyWithRetain_; чтобы именовать iVar по-другому.

Обратите внимание, что даже в этом случае вызов retainCount может быть ужасно вводящим в заблуждение.Попробуйте это с [NSNumber numberWithInt: 2]; или постоянной строкой.На самом деле, не звоните retainCount.Не когда-либо.

...