3

プロジェクトをARCに移行した後、割り当て解除されたインスタンスでデリゲートメソッドが呼び出されない/呼び出されないという問題が発生しました。問題は、割り当てられてから非同期タスクを実行する変数があることです。簡単な例として、デリゲートメソッドexecuteDidSucceedに応答するMyServiceというオブジェクトがあると仮定します。

- (void)fireRequest {
    MyService *service = [[MyService alloc] initWithDelegate:self];
    [service execute];
} 

元のコードは次のようになります。

- (void)fireRequest {
    MyService *service = [[[MyService alloc] initWithDelegate:self] autorelease];
    [service execute];
} 

releaseARCでは、呼び出された後に呼び出しが追加されることを理解しています[service execute]。また、メソッドが非同期であるため、serviceオブジェクトの割り当てが解除され、デリゲートメソッドに対して割り当て解除されたオブジェクトが呼び出されることも理解しています。

解決策はservice、インスタンス変数を作成し、strongその所有権を保持できるようにプロパティを指定することです。また、ブロックを作成して完了ハンドラーを使用し、ブロックが完了するまでデリゲートが保持されるようにするソリューションを知っています。私の質問は、このような状況に対処するための最良の方法は何ですか?それ以上に、ARCへの移行中にこれを解決するための「ベストプラクティス」は何ですか?

4

1 に答える 1

4

Myservice オブジェクトをこのクラスのメンバーにする必要があります。この関数への参照がなくなったため、ARC はこの関数が完了するとすぐにそれをクリーンアップします。

また、デリゲートを呼び出すまでそのオブジェクトへの参照がないため(もしそうなら)、状況によっては完了する前にサービスを停止する必要があるかもしれないので、それを行うのは良い習慣だと思います。

于 2012-10-08T18:25:21.460 に答える