0

ビュー コントローラーに負荷の高い処理タスクがいくつかあるため、GCD を使用してそれらをバックグラウンド スレッドに配置しました。そして、タスクはクラス AsyncImageProcessor にカプセル化されます

@interface AsyncProcessor : NSObject

@property (weak, nonatomic) id<AsyncProcessorDelegate> delegate;

// ... other unrelated stuff

@end

@protocol AsyncProcessorDelegate <NSObject>

- (void) asyncProcessorEvent:(AsyncProcessorEventType) event;

@end

問題は、AsyncProsessor タスクがディスパッチされた直後に、デリゲートを実装するビュー コントローラーが破棄されることです。そして、処理が完了するまでに、View Controller のメモリが解放され、delegate は nil になります。その後、委任されたイベントをビュー コントローラーに戻すことはできません。

考えられる解決策の 1 つは、デリゲートを "strong" に定義し、デリゲート メソッド asyncProcessorEvent でデリゲートを nil に設定して、すべての処理が完了した後にメモリ サークルを壊すことです。しかし、これはハックだと思います。デリゲートは「弱い」と定義する必要があるとどこでも言われました。

誰かが以前にこの問題を抱えていましたか? いくつかの提案をしてください。

4

0 に答える 0