2011-04-27 70 views
1

我做的第一件事是创建一个ViewController并将其推送到导航控制器。正确地释放viewController,将其设置为委托给其他类的自我?

viewController = [[MyViewController alloc] init]; 
[navController pushViewController:viewController animated: NO]; 
[viewController release]; 

保留计数是2(pushViewController使用2保留显然,但不是我的责任)迄今为止很好。

Inside MyViewController我创建了一个类的实例,并将ViewController设置为委托给实例。

timer = [[MyBackgroundTimer alloc] initWithInterval:20]; 
[timer setDelegate:self]; 

现在viewControllers保留计数增加了1 becouse setDelegate的:

但是当我释放的viewController后,它永远不会调用dealloc的becouse我还有一个保留计数。

当您将自己设置为委托时,应如何正确删除保留计数?

回答

0

您的类MyBackgroundTimer应该将delegate属性指定为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的类与委托类相同,它也在dealloc处释放MyBackgroundTimer(这几乎是常见的情况),两个类的dealloc方法都不会被调用,因为每个类都拥有另一个,导致内存泄漏(这将而不是显示在仪器上)。

+1

你不应该保留你的代表。当'MyViewController'准备释放时,它应该释放'MyBackgroundTimer'或将'MyBackgroundTimer'的委托设置为零。 – kubi 2011-05-15 19:48:51

+0

甚至读过答案?多数民众赞成在我的'你的班MyBackgroundTimer应该有委托财产作为分配,而不是保留。'...你知道什么分配意味着什么? – 2011-05-15 21:17:37

+0

...然后你继续说,“这个班级应该保留代表......”我误解了你的答案吗? – kubi 2011-05-15 21:35:48

2

不要保留你的代表。如果您使用的是属性,请将您的委托定义为分配,而不是保留。其他人需要保留你的代表,而不是你。

相关问题