ios - 在 dealloc 之后检查回调中的对象

标签 ios uitableview exc-bad-access

请耐心等待我解释这一点。

我在 UITableViewCell 中有一个 HJManagedImageV 实例。 我将它的回调设置为 self,一个 UIVIewController 实现 需要的协议(protocol)(HJManagedImageVDelegate)。

当我导航到然后快速离开这个 Controller 时,回调是 最终向不再存在的物体开火。 (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 是否仍然可用?

最佳答案

使用委托(delegate)模式的对象的生命周期不会比它们的委托(delegate)长,这是一个很好的设计实践。但是,如果这是不必要的坏事,您应该确保在释放委托(delegate)本身时将对象的委托(delegate) ivar 设置为 nil。

换句话说, 通常委托(delegate)恰好是其对象的所有者。然后,如果他们希望自己的 child 比自己长寿,所有者有责任清除委托(delegate) ivars。

关于ios - 在 dealloc 之后检查回调中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10780288/

相关文章:

iphone - iOS - 如何正确访问数组中的对象属性?

ios - UITableViewCells Nib 在滚动时显示默认值

iphone - Xcode 在静态单元格上设置附件标记错误

c - libcurl (7.19,7) 在 OSX (10.6.8) 上因 _mdns_query_callback 而崩溃

ios - 使用并行作用域中的 block 中的变量

ios - 在 xcode 8 beta 6 中的 UITableView 中使用 indexPath.row 无法编译

ios - AppDelegate.m 文件中的两个包冲突

ios - 将标记 infoWindow 添加到 Mapbox 注释

swift - 如何给UITableViewCell添加左右边距

c - 为什么我得到 EXC_BAD_ACCESS?