我已经写了下面的类别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:
(从NSOperationQueue
)不显示警告:
[_queue addOperationWithBlock:^ {
[self foo:nil];
}];
我真的不明白。 特别是我不明白的是: 我应该在两种情况下实际使用弱指针吗?实际上这两个片段会带来一个保留周期,以防我不使用弱指针?
比较:http://stackoverflow.com/a/15536473/1187415:'塞玛:: checkRetainCycles()'中,如果方法名称以 “set” 或 “添加” 启动静态分析警告,但*不是*用于“addAsynchronousOperationWithBlock”。 – 2013-05-09 02:25:35
...更正:如果方法名称以“set”或“add”开头,则静态分析器将发出警告,但对于“addOperationWithBlock”,则会发出* not *警告。 – 2013-05-09 08:05:45
我认为你的意思是“addOperationWithBlock”,而不是“addAsynchronousOperationWithBlock”在最后的代码示例? – 2013-05-09 08:20:18