Геттер последовательность событий? - PullRequest
0 голосов
/ 10 сентября 2009

Я пытаюсь понять, что происходит в геттере ниже, это то, что я понимаю до сих пор:

(1) получатель возвращает указатель на объект NSString. (2) объект NSString сохраняется, возможно, потому что мы только что дали указатель на него. (3) авто-релиз? когда это активируется, когда экземпляр PlanetClass освобождается (освобождается)?

// CLASS
@interface PlanetClass : NSObject {
        NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end

// GETTER
- (NSString *)planetName{
        return[[planetName retain] autorelease];
}

РЕДАКТИРОВАТЬ: Я думаю, что я более смущен относительно причины фактического сохранения и более позднего выпуска. Насколько я понимаю, получатель просто возвратил указатель либо на ноль, либо на уже существующий объект (т. е. был установлен установщиком). Я думаю, что понимаю удержание, поскольку мы выдаем указатель, и нам нужно отслеживать это, но как насчет выпуск, это просто отказоустойчивый случай, который я позже забуду выпустить объект NSString?

Переменная экземпляра planetName также выпущена в моем методе dealloc (см. Ниже). Автозапуск, кажется, делает то же самое, чуть позже, когда пул истощается?

- (void)dealloc {
        [planetName release];
        [super dealloc];
}

ура -gary-

Ответы [ 3 ]

4 голосов
/ 10 сентября 2009

Возможно, было бы неплохо позволить Objective-C обрабатывать это как свойство, позволяя вам очистить некоторые реализации, чтобы сохранить управление памятью, ну, в общем, управляемым:

@interface PlanetClass : NSObject {
    NSString* planetName;
}
@property(nonatomic, retain) NSString* planetName;
@end // PlanetClass

@implementation PlanetClass
@synthesize planetName
//... rest of PlanetClass here
@end // PlanetClass

Есть множество из документов доступно онлайн для более подробной информации о свойствах Objective-C и @synthesize.

Документы по управлению памятью

Я настоятельно рекомендую это чтение от Apple по управлению памятью , чтобы попытаться помочь понять, о чем вся эта retain / release хаббуб.

1 голос
/ 10 сентября 2009

Когда авто-релиз отправляется объекту, он добавляется в пул авто-релиза. Когда пул очищается, он отправляет релиз всем объектам в пуле. Таким образом, любой объект в пуле автоматического выпуска будет освобожден при его сливе

0 голосов
/ 11 сентября 2009

Возврат / авто-релиз в методе getter ничего не делает, вы можете просто вернуть planetName

...