当我试图解释这个时,请耐心等待。
我在UITableViewCell中有一个HJManagedImageV实例。 我将它的回调设置为self,一个UIVIewController实现了 需要的协议(HJManagedImageVDelegate)。
当我导航到然后快速离开此控制器时,回调就是 最终解雇了不再存在的物体。 (HJManagedImageV 保留其代表。)
问题是在回调内部我无法检查 如果对象有效而没有获得EXC_BAD_ACCESS。
-(void)managedImageSet:(HJManagedImageV*)mi {
mi.callbackOnSetImage = nil;
if(mi != nil && mi.image != nil) { // EXC_BAD_ACCESS when checking mi.image
[mi setImage:[mi.image roundedCornerImage:9 borderSize:0]];
}
}
这是崩溃时的mi:
mi HJManagedImageV * 0x0022fae0
UIView UIView
oid id 0x00000000
url NSURL * 0x00000000
moHandler HJMOHandler * 0x00000000
image UIImage * 0x00000000
imageView UIImageView * 0x00000000
callbackOnSetImage id 0x00000000
callbackOnCancel id 0x00000000
callbackOnError id 0x00000000
isCancelled BOOL false
loadingWheel UIActivityIndicatorView * 0x00000000
onImageTap NSInvocation * 0x00000000
index int -1
modification int 0
我很困惑为什么检查mi.image会让我崩溃。我怎么知道mi是否仍然可用?
答案 0 :(得分:1)
使用委托模式的对象不会超过其委托,这是一个很好的设计实践。但是,如果这是一个不必要的恶,那么当代理本身被释放时,你应该确保你的对象的委托ivar被设置为nil。
换句话说, 通常,代表恰好是他们对象的所有者。然后它的主人有责任清除代表ivars,如果他们希望他们的孩子自己活得更久。