正确释放一个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。 别人需要保留你的代表,而不是你。