正确释放一个viewController,将其设置为其他类的委托?

我做的第一件事是创建一个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因为我还有一个保留计数。

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

您的类MyBackgroundTimer应该将delegate属性设置为assign而不是retain。

 @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例中的timerStopped方法)

我这样说是因为如果你尝试在dealloc方法中释放委托,那么实例化MyBackgroundTimer的类与委托是同一个类,它也会在dealloc中释放MyBackgroundTimer (这几乎是常见的情况),dealloc方法永远不会调用这两个类,因为每个类都拥有另一个类的所有权,导致内存泄漏( 不会在仪器上显示)。

不要保留你的代表。 如果您正在使用属性,请将您的委托定义为assign,而不是retain。 别人需要保留你的代表,而不是你。