1

我有这段代码,我有一些我想并行执行的任务,问题是一个电影对象在调度可以处理之前在每个运行循环上释放。有没有办法在 ARC 中保留它?现在我在调度之外处理大部分逻辑并使用__block将其传递,但​​是如果这是一个耗时的过程并且想要在调度块中处理它我应该怎么做?

for (HTMLNode *movie in movieContainer) {
  dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// time consuming process on movie object
});

dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   // combine the results
});
4

3 回答 3

3

大多数时候,您不必这样做。块自动捕获默认使用的所有变量,但是,当使用快速迭代时,会出现异常。

因为快速迭代使用__unsafe_unretained原始指针而不是强指针(为了速度),所以在这种情况下,您可以简单地使用 strong 限定迭代变量:

for (HTMLNode __strong *movie in movieContainer) {
  dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// time consuming process on movie object
});
于 2012-06-27T13:58:45.140 回答
0

使用关键字创建一个局部变量并将其__strong影响为电影对象。然后在你的 dispatch_async 调用中使用这个强大的局部变量。

于 2012-06-27T13:52:49.023 回答
-1

手动保留释放

#import <objc/runtime.h>
id objc_retain(id);
void objc_release(id);

objc_retain(object);
objc_release(object);

或者

变量与

__strong
于 2012-06-27T13:54:56.433 回答