在块之间传递值类型

时间:2013-02-27 20:51:22

标签: ios grand-central-dispatch

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

1 个答案:

答案 0 :(得分:2)

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

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

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