根据我的理解,可以使用__block修饰符在块(和队列?)之间创建一个对象。
-(void)performRequest: (void (^)(NSArray* outcome))completion
{
dispatch_async(dispatch_get_global_queue(0,0), ^{
// do some request
__block NSArray * result = [[NSArray alloc]init]; //Outcome of the request.
completion(result);
});
}
我们假设完成块将在主线程上发送dispatch_async
我认为应该可以使用没有__block标识符的值类型来执行此操作。我是对的吗?
-(void)performRequest: (void (^)(int outcome))completion
{
dispatch_async(dispatch_get_global_queue(0,0), ^{
// do some request
int result = 10; //Outcome of the request.
completion(result);
});
}
答案 0 :(得分:2)
在您的第一个代码段中使用__block
完全没有意义。
__block
的全部目的是使值在另一个块中捕获时保持可变。你没有在任何地方捕获result
。
请注意,在MRR下,__block
具有防止捕获块保留该值的副作用,使其成为打破保留周期的常用方法。在ARC下,这不是真的。如果您需要避免保留周期,则需要使用__unsafe_unretained
或__weak
值。也就是说,这些都不适用于您提供的代码段。