私は次のカテゴリを書きましたNSOperationBlock
@implementation NSOperationQueue (Extensions)
-(void)addAsynchronousOperationWithBlock:(void (^)(block))operationBlock
{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
block signal = ^ {
dispatch_semaphore_signal(semaphore);
};
[self addOperationWithBlock:^{
operationBlock(signal);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_release(semaphore);
}];
}
@end
正しく動作しているように見えますが、呼び出すと (次のスニペットに示すように) 警告が表示されます。
ブロックは保持サイクルをリードする可能性があります
[_queue addAsynchronousOperationWithBlock:^(block signal) {
[self foo:nil];
signal();
}];
foo
このカテゴリを使用するクラスのメソッドです。
addOperationWithBlock:
(from )を使用した同じコードでNSOperationQueue
は、警告は表示されません。
[_queue addOperationWithBlock:^ {
[self foo:nil];
}];
私は本当にそれを理解していません。特に私が理解していないのは、両方のケースで実際に弱いポインターを使用する必要があるかどうかです。弱いポインターを使用しない場合、実際に2つのスニペットは保持サイクルをもたらしますか?