Каково дополнительное преимущество сохранения / автоматического освобождения уже сохраненного свойства? - PullRequest
2 голосов
/ 15 апреля 2011

В проекте, над которым я сейчас работаю, я работаю через код моих предшественников. Одна из вещей, с которыми я сталкиваюсь здесь и есть такие добытчики:

- (NSDictionary *)userInfo
{
    return [[userInfo retain] autorelease]; 
}

Очевидно, что userInfo уже сохранен классом, чего я не получаю: какова дополнительная ценность retain-auto-релиза этого объекта? Какая будет разница с этим методом:

- (NSDictionary *)userInfo
{
    return userInfo;
}

Приветствия
EP.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Представьте себе следующее:

id x = [[A alloc] init];
NSDictionary *userInfo = [x userInfo];
[x release];
// Do something with userInfo ...
// Would fail if the getter did not retain/autorelease.

Это не получится, если получатель не выполнит функцию сохранения / авто-выпуска, потому что userInfo будет освобожден, когда x будет освобожден.

3 голосов
/ 15 апреля 2011

Это позволяет возвращаемому результату сохраняться в течение всего текущего стека вызовов, даже если промежуточный объект освобожден в промежуточный период.Обычай в Какао состоит в том, что все, что возвращается геттером без ссылки на владельца (т. Е. Любой геттер без 'new', 'alloc', 'retain' или 'create' в имени) будет длиться по крайней мере столько, скольковмещающий пул автоматического выпуска.

Например:

Object1 *object1 = [[Object1 alloc] init];
ResultObject *result = [object1 someResult];
[object1 release];

// result is still valid here, even though object1 was released
...