我要做的第一件事是创建一个ViewController并将其推送到导航控制器。
viewController = [[MyViewController alloc] init];
[navController pushViewController:viewController animated: NO];
[viewController release];
现在保留计数为2(pushViewController使用2保留显然但不是我的责任)到目前为止一直很好。
在MyViewController中,我正在创建一个类的实例,并将ViewController设置为该实例的委托。
timer = [[MyBackgroundTimer alloc] initWithInterval:20];
[timer setDelegate:self];
现在viewControllers保留计数已增加1,因为setDelegate:
但是当我稍后发布viewController时,它永远不会调用dealloc因为我还有一个保留计数。
当您将自己设置为委托时,如何正确删除保留计数?
答案 0 :(得分:2)
不要保留您的代表。如果您正在使用属性,请将您的委托定义为assign,而不是retain。其他人需要保留你的代表,而不是你。
答案 1 :(得分:0)
您的班级MyBackgroundTimer
应该将委托属性设为分配而不是保留。
@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
的类与委托是同一个类,它也会在dealloc中释放MyBackgroundTimer
(几乎是常见的情况),两个类的dealloc方法永远不会被调用,因为每个类都拥有另一个类的所有权,导致内存泄漏(不会在工具中显示)。