Вопрос

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

(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];
}

ура -Гэри -

Это было полезно?

Решение

Это может быть хорошей идеей, чтобы 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 .

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top