ビュー コントローラーに負荷の高い処理タスクがいくつかあるため、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 に設定して、すべての処理が完了した後にメモリ サークルを壊すことです。しかし、これはハックだと思います。デリゲートは「弱い」と定義する必要があるとどこでも言われました。
誰かが以前にこの問題を抱えていましたか? いくつかの提案をしてください。