1

iOSアプリでバックグラウンド処理を処理するためにを使用してNSOperationおり、ターゲット/アクションパターンを理解しようとしています。デリゲートパターンでは、デリゲートは弱参照として保持され、デリゲートオブジェクトは、他のオブジェクトのデリゲートフィールドをsの前にnilに設定する責任がありますdealloc。ターゲット/アクションパターンでは、私が理解しているように、同様の理由で、ターゲットは弱参照として保持されます。ただし、ターゲットオブジェクトがsのnil場合、ターゲットフィールドを「アウト」するのは簡単ではないようです。また、 sを使用すると、ターゲットの割り当てが解除されたときに、操作がキューに残っている可能性があります。deallocNSOperation

NSOperationこの場合(バックグラウンド処理を実行し、ターゲット/アクションを使用して値を作成者に返す)、メモリ管理をどのように処理する必要がありNSOperationますか?

4

2 に答える 2

2

ターゲットで説明されているように、コントロールがアクションを送信する可能性がある場合にターゲットが使用可能であることを確認するのはあなた次第です。実際には、これは問題ではありません。ターゲットは通常、コントロールの前に作成され、コントロールの後に割り当てが解除されたコントローラーであるためです。

操作からアクションメッセージを送信する場合は、操作が完了するまでターゲットの割り当てが解除されないようにする必要があります。これを行う1つの方法は、操作が完了するまでターゲット自体を保持することです。

別のアプローチは、操作とターゲットの両方に認識されている中間オブジェクトを使用することです。この操作では、中間オブジェクトをターゲットのプロキシのように扱い、アクションをターゲットに直接送信するのではなく、ターゲットに送信できます。また、ターゲットの割り当てが解除された場合、ターゲットは中間オブジェクトを適切に更新できます。ターゲットとオペレーションの両方が、保持サイクルを作成せずに中間体を保持できます。この方法が私の最初の選択肢になるかどうかはわかりませんが、少し複雑すぎるようですが、役立つかもしれません。

于 2011-06-01T02:57:55.700 に答える
0

UIControlはターゲットの__weak参照を取得するため、target-actionメソッドはターゲットの有効期間を変更しません。

NSTimerはターゲットの__strong参照を取得します。ターゲットは、NSTimerオブジェクトがdeallocするまでdeallocしません。これにより、保持円が作成される場合があります。

このポッドを試してください:https ://github.com/Elenionl/ELAutoSelector

于 2017-11-28T08:00:55.293 に答える