【发布时间】:2012-09-19 20:12:52
【问题描述】:
我想知道这是否是让嵌套块在 Objective C 中处理同一变量而不会导致任何内存问题或 ARC 崩溃的正确方法。它以 ASIHttpRequest 完成块开始。
MyObject *object = [dataSet objectAtIndex:i];
ASIHTTPRequest *request = [[ASIHTTPRequest alloc]initWithURL:@"FOO"];
__block MyObject *mutableObject = object;
[request setCompleteBlock:^{
mutableObject.data = request.responseData;
__block MyObject *gcdMutableObject = mutableObject;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
[gcdMutableObject doLongComputation];
dispatch_async(dispatch_get_main_queue(),^{
[self updateGUIWithObject:gcdMutableObject];
});
});
[request startAsynchronous];
我主要关心的是嵌套调度队列并使用前一个队列的 __block 版本来访问数据。我所做的安全吗?
【问题讨论】:
-
为什么你有这么多指向同一个对象的指针?此外,这不是“安全”问题,而是您想要发生的事情。如果您指定所需的意图,这将有助于提供更合适的响应。否则,我很想看看那段代码,摇摇头,然后继续前进。
-
我的意图是在每个块级别修改对象并在最里面的块中安全地返回到主线程。
-
你在滥用 __block。只需使用一次。
标签: objective-c automatic-ref-counting asihttprequest objective-c-blocks grand-central-dispatch