Последовательность событий геттера?
-
05-07-2019 - |
Вопрос
Я пытаюсь понять, что происходит в получателе ниже, это то, что я понимаю до сих пор:
(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