Ваш класс MyBackgroundTimer
должен иметь свойство делегата в качестве assign и не сохранять.
@property (nonatomic, assing) id delegate;
И этот класс должен сохранить делегата именно тогда, когда ему нужно его использовать, и освободить, когда это будет сделано.
@implementation MyBackgroundTimer
@synthesize delegate;
-(void) startTimer {
[self.delegate retain];
//... do some actions
}
-(void) timerStopped {
//... call delegate methods
[self.delegate release]
}
@end
Важно помнить, что вы можете иметь своего делегата в качестве сохраняемого свойства. Но чтобы сделать это правильно, вы должны убедиться, что вы освободили его до вызова dealloc (как метод timerStopped
в приведенном выше примере)
Я говорю это потому, что если вы попытаетесь освободить делегат в методе dealloc, класс, который создает экземпляр MyBackgroundTimer
, будет того же класса, что и делегат, и он также выпустит MyBackgroundTimer
в dealloc (что в значительной степени в общем случае), метод dealloc обоих классов никогда не будет вызван, поскольку каждый класс будет владеть другим, что приведет к утечке памяти (которая будет не отображаться на приборах).