1

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

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

4

1 回答 1

1

使用委托模式的对象的寿命不会超过其委托,这是一种很好的设计实践。但是,如果这是不必要的坏事,则应确保在解除分配委托时将对象的委托 ivar 设置为 nil。

换句话说,委托经常碰巧是他们的对象的所有者。然后,如果他们希望自己的孩子活得更久,那么所有者有责任清除代表 ivars。

于 2012-05-28T08:19:12.367 回答