在dealloc之后检查回调内的对象

时间:2012-05-28 06:33:03

标签: ios uitableview exc-bad-access

当我试图解释这个时,请耐心等待。

我在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是否仍然可用?

1 个答案:

答案 0 :(得分:1)

使用委托模式的对象不会超过其委托,这是一个很好的设计实践。但是,如果这是一个不必要的恶,那么当代理本身被释放时,你应该确保你的对象的委托ivar被设置为nil。

换句话说, 通常,代表恰好是他们对象的所有者。然后它的主人有责任清除代表ivars,如果他们希望他们的孩子自己活得更久。

相关问题