1

これを説明しようとしている間、我慢してください。

UITableViewCell 内に HJManagedImageV のインスタンスがあります。必要なプロトコル (HJManagedImageVDelegate) を実装する UIVIewController である self にコールバックを設定します。

このコントローラーからすぐに移動すると、コールバックは、もはや存在しないオブジェクトで最終的に起動されます。(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に設定されていることを確認する必要があります。

言い換えれば、代理人がたまたまオブジェクトの所有者であることがよくあります。次に、子供が長生きすることを期待している場合は、代理人のivarを一掃するという所有者の責任があります。

于 2012-05-28T08:19:12.367 に答える