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] retain] 是为了防止对象被释放。但是现在 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这里是 a Class)。

于 2013-02-26T06:00:32.587 回答