我正在开发一个面向4.0和5.0版本的iOS项目,并使用ARC。
遇到了与Blocks、ARC和从Block外部引用对象有关的问题。这里是一些代码:
__block AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlock:^ {
if ([operation isCancelled]) {
return;
}
... do stuff ...
operation = nil;
}];
在这种情况下,编译器会警告在块中使用'operation'将导致保留循环。在ARC下,__block现在会保留变量。如果我添加__unsafe_unretained,编译器会立即释放对象,所以显然这不起作用。
我正在针对4.0进行目标设置,因此无法使用__weak。
我尝试过像这样做:
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
__block __unsafe_unretained AFHTTPRequestOperation *weakOperation = operation;
但是,当weakOperation不为nil时,在块内部它的任何属性都没有被填充。
考虑到上述项目限制,最好的处理方式是什么?
#pragma clang diagnostic ignored "-Warc-retain-cycles"
。 - Charlie Groves