我有问题。我的视图控制器(ViewController)实现了一个对象的委托方法(DataPuller,数据来自互联网)。 DataPuller将在互联网上检索数据,而不会阻止用户与视图的交互。但是当我在屏幕之间导航时,在某些情况下,在DataPuller返回对象列表之前释放ViewController。 DataPuller返回,它检查:
if (delegate && [delegate respondsToSelector:@selector(getCommentDidDownloadFinish:)]) {
[self.delegate performSelector:@selector(getCommentDidDownloadFinish:) withObject:self];
}
由于ViewController的发布,应用程序崩溃了,它变成了一个僵尸对象。有没有人之前有这个问题以及如何解决它?我认为另一种方式是使用NSNotification,但我想知道任何其他更好的解决方案。任何想法,解决方案都欢迎。感谢。
答案 0 :(得分:2)
您的视图控制器必须在某些时候将其自身删除为DataPuller委托。典型地,这是在dealloc方法中处理的:
- (void)dealloc {
dataPuller.delegate = nil;
[dataPuller release];
[super dealloc];
}
您也可以决定在-viewDidUnload或-viewDidDisappear中执行此操作:。
答案 1 :(得分:1)
委托(通常)暗示某种所有权 - 即,如果您将对象作为另一个对象的委托,通常委托对象拥有强引用(即保留)委托对象。
作为示例,UITableViewController是其UITableView的委托。这没关系,因为控制器通过“view”属性保留了tableview。
如果您的设计不允许所有权,请使用您已建议的通知。作为奖励,如果您需要,通知可以向多个听众发出信号。
不要忘记在视图控制器的dealloc中删除你的观察者!