Если вы используете assign для своего свойства, вы не вызываете retain для объекта.
Это означает, что вы определенно НЕ должны вызывать release или autorelease на нем!
Твоя линия в твоей сделке
[someDelegate release];
вызовет сбой в будущем - вы должны удалить его. Вам не нужно заботиться о назначенных свойствах в методе dealloc.
Ваша линия
[self setSomeDelegate:nil];
не протечет.
Однако у вас, похоже, есть [[someDelegate alloc] init]
в вашем viewDidLoad
методе. Это необычно; для делегата нормально быть внешним объектом, а не созданным вами. В вашем случае это на самом деле не делегат, это просто объект, который делает что-то для вас - вы должны переименовать его и изменить свойство на сохранение (и не забудьте освободить его в dealloc).
В настоящее время, если ваше свойство установлено на (назначить), а кто-то другой устанавливает его, вы утечете свой первоначальный делегат. Если вы используете только делегат внутри этого класса, возможно, он вообще не должен быть свойством? Если вы просто хотите читать его за пределами своего класса, вы можете использовать (только для чтения) вместо assign (и изменить [self setSomeDelegate:nil]
на someDelegate=nil;
)
Ваша строка в viewDidUnload
, в которой для делегата установлено значение nil, устраняет проблему, поднятую во втором комментарии: вы удаляете делегата, поэтому к тому времени, когда вы снова наберете viewDidLoad
, ваш делегат уже равен нулю :)