在委托返回之前查看控制器版本

时间:2011-04-22 09:30:27

标签: iphone delegates

我有问题。我的视图控制器(ViewController)实现了一个对象的委托方法(DataPuller,数据来自互联网)。 DataPuller将在互联网上检索数据,而不会阻止用户与视图的交互。但是当我在屏幕之间导航时,在某些情况下,在DataPuller返回对象列表之前释放ViewController。 DataPuller返回,它检查:

if (delegate && [delegate respondsToSelector:@selector(getCommentDidDownloadFinish:)]) {
    [self.delegate performSelector:@selector(getCommentDidDownloadFinish:) withObject:self];
}

由于ViewController的发布,应用程序崩溃了,它变成了一个僵尸对象。有没有人之前有这个问题以及如何解决它?我认为另一种方式是使用NSNotification,但我想知道任何其他更好的解决方案。任何想法,解决方案都欢迎。感谢。

2 个答案:

答案 0 :(得分:2)

您的视图控制器必须在某些时候将其自身删除为DataPuller委托。典型地,这是在dealloc方法中处理的:

- (void)dealloc {
     dataPuller.delegate = nil;
     [dataPuller release];
     [super dealloc];
}

您也可以决定在-viewDidUnload或-viewDidDisappear中执行此操作:。

答案 1 :(得分:1)

委托(通常)暗示某种所有权 - 即,如果您将对象作为另一个对象的委托,通常委托对象拥有强引用(即保留)委托对象。

作为示例,UITableViewController是其UITableView的委托。这没关系,因为控制器通过“view”属性保留了tableview。

如果您的设计不允许所有权,请使用您已建议的通知。作为奖励,如果您需要,通知可以向多个听众发出信号。

不要忘记在视图控制器的dealloc中删除你的观察者!