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

时间:2011-04-27 22:52:00

标签: iphone objective-c ios ipad

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

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

2 个答案:

答案 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方法永远不会被调用,因为每个类都拥有另一个类的所有权,导致内存泄漏(会在工具中显示)。