0

このコードをここの別のスレッドから取得しました。完全に機能しますが、リークが発生し、リリースする方法がわかりません。GoToNext割り当て行に「autorelease」ステートメントを追加してみました。それは役に立たなかった。誰かがこれを適切に処理する方法を知っていますか?

webView.delegate = [[GoToNext alloc] initWithTarget:self andNext:@selector(loadUpdateGraph)]; //leak

これはGoToNextコードです:

.h

    @interface GoToNext : NSObject <UIWebViewDelegate> {
    id __weak target;
    SEL next;
}
-(id)initWithTarget:(id)target andNext:(SEL)next;
-(void)webViewDidFinishLoad:(UIWebView *)webView;
@end

.m

#import "GoToNext.h"


@implementation GoToNext
-(id)initWithTarget:(id)_target andNext:(SEL)_next {
    self = [super init];
    if (self) {
        target = _target;
        next = _next;
    }
    return self;
}
-(void)webViewDidFinishLoad:(UIWebView *)webView {
    [target performSelector:next];
}
@end
4

1 に答える 1

1

GoToNextを使用するインスタンスを作成するとalloc、そのインスタンスの保持カウントは1になります。アプリのどこかで、このインスタンスへの唯一の参照(この場合はのdelegateプロパティwebView)を失う前に、このインスタンスを解放する必要があります。aのdelegateプロパティはセマンティクスを使用するため、のインスタンスをそのプロパティに割り当ててもUIWebView、そのプロパティは保持されません。これは、割り当てが解除されたメモリのデリゲートであるか、それを指している間は、それを実行できないことを意味します。assignGoToNextreleaseautoreleasewebViewwebView.delegate

webView.delegateこのコードを含むクラスのライフサイクルで一度だけ設定していることが確実な場合は、そのクラス[webView.delegate release]deallocメソッドを入力するだけで問題を解決できます。複数回設定する場合は、次のようなメソッドを作成してみてください。

-(void)setWebViewDelegate:(id)delegate {
    if (webView.delegate) {
        [webView.delegate release];
    }
    webView.delegate = delegate;
}

そして、そのメソッドを使用してwebViewのデリゲートを設定します。この状況を処理する方法は他にもありますが、この方法ではおそらくコードへの変更が最小限で済むと思います。

もちろん、私の意見では、すべての最善の解決策は、アプリケーションをARCに変換するだけで、この種のことを二度と心配する必要はありません。

于 2012-07-13T22:42:32.340 に答える