以下是我的代码,使用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必须释放它。这是正确的方法吗?
答案 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
)。