0

以下は、GCD を使用してネットワークからデータをフェッチし、それをメイン キューの応答ブロックに渡すコードです。

+ (void)allData:(void(^)(NSArray*))responseBlock
{
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            __block NSArray *data = [[self all] retain]; // get data from network 
            dispatch_async(dispatch_get_main_queue(), ^{
                responseBlock(data); // 2
            });
        });
}

[[self all] keep] は、オブジェクトが解放されないようにするためのものです。しかし今、responseBlock はそれを解放しなければなりません。これは正しい方法ですか?

4

1 に答える 1

-1

あなたはこのようにすることができます

+ (void)allData:(void(^)(NSArray*))responseBlock
{
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            __block NSArray *data = [[self all] retain]; // get data from network 
            dispatch_async(dispatch_get_main_queue(), ^{
                responseBlock(data); // 2
                [data release]; // you can release here
                data = nil;
            });
        });
}

または単に削除する__blockと、内側のブロック (メイン キューに渡すブロック) がdata自動的に保持/解放されますdata。これは、他に何も保持しないため、ここでは保持サイクルの可能性を確認できません (selfここには があるためClass)。

于 2013-02-26T06:00:32.587 に答える