我编写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
}
它有效,但无论如何都会定期崩溃。
答案 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)
它有效,但无论如何都会定期崩溃。
这是一个矛盾。有两种可能性:
您的修复工作正常,应用程序因其他原因而崩溃。
您的修复程序无效,应用程序因崩溃之前的原因继续崩溃。
如果不知道这两种可能性中的哪一种实际上正在发生,很难知道什么是错的。查看错误消息和崩溃中的证据,例如堆栈爬网。为什么应用程序崩溃了?是否尝试在没有先检查的情况下取消引用delegate
属性?它是否依赖于委托做某事,所以如果委托不再存在那件事就不会完成而反过来会导致崩溃?这些是我要寻找的东西,但最重要的是从你拥有的证据开始并遵循你的鼻子。