プロジェクトをARCに移行した後、割り当て解除されたインスタンスでデリゲートメソッドが呼び出されない/呼び出されないという問題が発生しました。問題は、割り当てられてから非同期タスクを実行する変数があることです。簡単な例として、デリゲートメソッドexecuteDidSucceedに応答するMyServiceというオブジェクトがあると仮定します。
- (void)fireRequest {
MyService *service = [[MyService alloc] initWithDelegate:self];
[service execute];
}
元のコードは次のようになります。
- (void)fireRequest {
MyService *service = [[[MyService alloc] initWithDelegate:self] autorelease];
[service execute];
}
release
ARCでは、呼び出された後に呼び出しが追加されることを理解しています[service execute]
。また、メソッドが非同期であるため、service
オブジェクトの割り当てが解除され、デリゲートメソッドに対して割り当て解除されたオブジェクトが呼び出されることも理解しています。
解決策はservice
、インスタンス変数を作成し、strong
その所有権を保持できるようにプロパティを指定することです。また、ブロックを作成して完了ハンドラーを使用し、ブロックが完了するまでデリゲートが保持されるようにするソリューションを知っています。私の質問は、このような状況に対処するための最良の方法は何ですか?それ以上に、ARCへの移行中にこれを解決するための「ベストプラクティス」は何ですか?