Как обрабатывается релиз для свойств сохранения @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 метод?

Ответы на вопрос(4)

Ваш ответ на вопрос