Как обрабатывается релиз для свойств сохранения @synthesized?
У меня есть несколько вопросов о синтезированных свойствах в Objective-C. Полный список следует, но основной вопрос заключается в следующем:Как компилятор обеспечивает правильное освобождение ivars для синтезированных свойств, даже если мой код может включать или не включать методы release в dealloc?
Примечание: я решил не публиковать их как отдельные вопросы, потому что они так тесно связаны и потому что есть несколько существующих вопросов, которыепотрогать по отдельным вопросам, не понимая сути вопроса.
Несколько похожие вопросы:
Нужно ли освобождать собственность?В чем разница между собственностью и синтезом?Вопрос о сохранении атрибута со свойством и обобщенииНастроить: Рассмотрим класс с одним свойством:
@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end
Вопрос 1: Самый простой случай:
@implementation Person
@synthesize name;
@end
С этой настройкой я предполагаю, чтоname
будет автоматически выпущен всякий раз, когдаPerson
объект освобожден На мой взгляд, компилятор просто вставляет[name release]
вdealloc
метод, как будто я набрал его сам. Это верно?
Вопрос 2: Если я решу написать свой собственныйdealloc
метод для этого класса, и я опускаю вызов[name release]
Будет ли это утечка?
@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
Вопрос № 3: Если я решу написать свой собственныйdealloc
метод для этого класса, и явключают вызов[name release]
, приведет ли это к двойному выпуску, так как@synthesize
уже позаботился об этом для меня?
@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end
Вопрос № 4: Если я решу написать свой собственный аксессор свойств для этого класса, но яне делайте написать свойdealloc
метод, воляname
быть утечкой?
@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
@end
Вопрос № 5: У меня есть чувство (на основе опыта), чтоникто из приведенных выше сценариев приведет к утечкам или двойным выпускам, так как язык был разработан, чтобы избежать их. Это, конечно, поднимает вопрос «как?». Является ли компилятор достаточно умным, чтобы отслеживать все возможные случаи? Что, если бы я сделал следующее (обратите внимание, что это нелепый пример, просто чтобы проиллюстрировать мою точку зрения):
void Cleanup(id object) { [object release]; }
@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end
Будет ли это обмануть компилятор в добавление другого[name release]
кdealloc
метод?