【问题标题】:How to retain Object passing to a block in ARC如何保留传递给ARC中块的对象
【发布时间】:2012-06-28 22:41:26
【问题描述】:

我有这段代码,我有一些任务要并行执行,问题是电影对象在调度可以处理之前在每个运行循环上释放。有没有办法在 ARC 中保留它?现在我在 dispatch 之外处理大部分逻辑并使用 __block 传入,但如果这是一个耗时的过程,并且想在 dispatch 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
});

【问题讨论】:

    标签: iphone objective-c block


    【解决方案1】:

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

    因为快速迭代使用 __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
    });
    

    【讨论】:

    【解决方案2】:

    手动保留释放

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

    变量与

    __strong
    

    【讨论】:

    • 一个非常糟糕的主意。永远不要使用objc_retain。它会将 ARC 送入地狱,因为它不希望你做这样的事情。
    • 有些情况下没有其他选择,但有__strong更好
    • 总是有更好的选择。即使它涉及一个临时的强对象,在使用 ARC(而不是使用 CFObjects)时,您也不应该尝试将引用计数掌握在手中。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多