下面是我的代码,使用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必须发布它。这是正确的方式吗?
发布于 2013-02-26 14:00:33
你可以这样做
+ (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,内部块(您传递给main queue的那个)将自动保留/释放data,并且因为data不保留任何其他内容,所以我在这里看不到任何可能的保留周期(因为这里的self是一个Class)。
https://stackoverflow.com/questions/15081998
复制相似问题