在块中保留对象

时间:2013-02-26 05:28:17

标签: objective-c memory-management memory-leaks block

以下是我的代码,使用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
            });
        });
}

[[all all] retain]是为了防止对象被释放。但现在responseBlock必须释放它。这是正确的方法吗?

1 个答案:

答案 0 :(得分:-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)。