私のクラスが次のように見えるとしましょう
@interface MyClass {
MyObject* _object;
dispatch_queue_t _queue;
}
-(void)myBlocksUsingMethod;
@end
キューの初期化のセマンティクスを無視して、実装します
-(void)myBlockUsingMethod {
dispatch_async(_queue, ^{
[_object doSomething];
});
}
上記のコードが示すように、ブロック内に自己を保持しても問題ありませんか?
ブロックを次のように書き換えることができます
-(void)myBlockUsingMethod {
__weak MyClass* weakSelf = self;
dispatch_async(_queue, ^{
MyClass* strongSelf = weakSelf;
[strongSelf._object doSomething];
});
}
しかしstrongSelf == nil
、この状況で my_queue
が保持しているオブジェクトの iVar であるかどうかをテストする必要があるでしょうか?
また、私のメソッドが参照する別のブロックを同じキューdoSomething
にプッシュするとどうなりますか? self
それは保持サイクルを引き起こしますか?