iOS检查调用方法之前是否存在委托

时间:2011-11-02 06:09:01

标签: iphone ios crash

我编写iOS应用程序并使用imageStore库来延迟加载图像并将它们缓存在内存中。 (https://github.com/psychs/imagestore)

在ViewController上,我创建了imagestore实例:

imageStore = [ImageStore new];
imageStore.delegate = self;

当图像加载成功时,imagestore调用委托方法

- (void)imageStoreDidGetNewImage:(ImageStore*)sender url:(NSString*)url

在tableview上执行reloadData以重绘单元格。 一切都很好。但是有一个问题:如果ViewController执行了卸载(返回导航控制器)并加载了图像,应用程序完成崩溃,因为imagestore调用了卸载ViewController的方法。

我尝试做以下事情: 1)在ViewController中,我将此代码放在viewDidUnload部分:

imageStore.delegate = nil;
imageStore = nil;

2)在imageStore中,我添加了对nil的检查:

if(delegate != nil) {
  ...call delegate method
}

它有效,但无论如何都会定期崩溃。

2 个答案:

答案 0 :(得分:12)

尝试将此代码放在dealloc部分。

imageStore.delegate = nil;
imageStore = nil;

同样,if子句不是必需的,因为应用程序会忽略对nil对象的任何调用,所以如果你有这样的东西:

id delegate = nil;    
[delegate callAnyMethod];

对你的应​​用程序行为没有影响,另一方面,如果方法委托的调用是可选的,你应该确保委托响应选择器,这样的事情应该可以解决问题:

if([delegate conformsToProtocol:@protocol(yourProtocolName)] && [delegate respondsToSelector:@selector(imageStoreDidGetNewImage:url:)]) {
       [delegate imageStoreDidGetNewImage:imageStore url:url];
}

干杯!

答案 1 :(得分:0)

  

它有效,但无论如何都会定期崩溃。

这是一个矛盾。有两种可能性:

  1. 您的修复工作正常,应用程序因其他原因而崩溃。

  2. 您的修复程序无效,应用程序因崩溃之前的原因继续崩溃。

  3. 如果不知道这两种可能性中的哪一种实际上正在发生,很难知道什么是错的。查看错误消息和崩溃中的证据,例如堆栈爬网。为什么应用程序崩溃了?是否尝试在没有先检查的情况下取消引用delegate属性?它是否依赖于委托做某事,所以如果委托不再存在那件事就不会完成而反过来会导致崩溃?这些是我要寻找的东西,但最重要的是从你拥有的证据开始并遵循你的鼻子。