我已经为
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
是使用该类别(category)的方法。
使用NSOperationQueue
中的addOperationWithBlock:
代码不会显示警告:
[_queue addOperationWithBlock:^ { [self foo:nil];
}];
我真的不理解它。 特别是我不理解的是: 在这两种情况下,我是否应该实际使用弱引用?如果我不使用弱引用,那么这两个片段是否会导致保留循环?