2010-11-09 6 views
0

Я просто изучаю цель C, поэтому я, вероятно, что-то пропустил, но ниже код является утечкой, верно?Объектив c утечка памяти в документе Apple?

Взятые из apple's docs:

- (NSString*) title { 
    return [[title retain] autorelease]; 
} 

- (void) setTitle: (NSString*) newTitle { 
    if (title != newTitle) { 
     [title release]; 
     title = [newTitle retain]; // Or copy, depending on your needs. 
    } 
} 

Поглотитель сохраняет и autoreleases (отменяя друг друга), но связующий сохраняет также. Это останавливает счетчик ссылок до достижения 0, верно? Что мне не хватает?

ответ

2

Что вам не хватает (потому что это не показано в примере) является то, что для всех сохраненных свойств в объекте dealloc будет release.

+0

так, почему бы просто не вернуть название из геттера? Смысл, исключить сохранение/автореферат? –

+0

nevermind, ответил здесь: http://stackoverflow.com/questions/801828/why-should-a-self-implemented-getter-retain-and-autorelease-the-returned-object –

0

Ах, если бы я читал дальше в документации, Apple объясняет:

Поскольку объект вернулся из ГЭТ аксессора autoreleased в текущей области видимости, она остается в силе, если значение свойства изменяется

Сохранение/автозагрузка полезно, когда сеттер вызывается после геттера, так как установщик отпускает старое значение.

Смежные вопросы