Опираясь на ответ Петра:
Когда вы создаете свойство, вы можете автоматически создавать методы получения и установки с помощью директивы @synthesize
. Компилятор не только создает два метода
- (id) delegate;
- (void) setDelegate: (id) newDelegate;
, но также содержит дополнительный код для предотвращения одновременного изменения свойства несколькими потоками (по сути, блокировка). nonatomic
сообщает компилятору, что код не должен быть потокобезопасным, что означает меньший код и лучшую производительность.
Сеттер, созданный компилятором с retain
, будет выглядеть примерно так:
- (void) setDelegate: (id) newDelegate {
if (delegate != newDelegate) {
[delegate release];
delegate = [newDelegate retain];
}
}
и именно поэтому вам нужно освободить сохраненные свойства в методе dealloc
вашего класса.
Поскольку общий совет заключается в том, чтобы не оставлять своего делегата, вы используете assign
вместо retain
, и установщик будет выглядеть так:
- (void) setDelegate: (id) newDelegate {
if (delegate != newDelegate) {
delegate = newDelegate;
}
}