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_unretainedまたは__weak値を使用する必要があります。繰り返しますが、これは提示されたコード スニペットには当てはまりません。

于 2013-02-27T20:59:09.557 に答える