0

据我了解,可以使用 __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);
    });
}
4

1 回答 1

2

在您的第一个代码片段中使用__block完全没有意义。

的全部目的__block是使值在另一个块中捕获时保持可变。你没有在result任何地方捕捉。

请注意,在 MRR 下,__block具有阻止捕获块保留值的副作用,使其成为打破保留周期的常用方法。在 ARC 下,这不是真的。如果您需要避免保留循环,则需要使用__unsafe_unretainedor__weak值。也就是说,这一切都不适用于您提供的代码片段。

于 2013-02-27T20:59:09.557 回答