【问题标题】:How should you use release with a __block variable?您应该如何将 release 与 __block 变量一起使用?
【发布时间】:2013-05-08 06:28:34
【问题描述】:

下面的代码工作正常,我只是不知道应该去哪里发布,因为我不确定规则是什么。我没有使用 ARC。

- (void)myFunc {

    // stuff happens

    __block UIImage* photo = [UIImage imageWithCGImage:croppedCGImage];

    [photo retain];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                         (unsigned long)NULL), ^(void) {
        [self doStuffToPhoto:photo];
        // [photo release] causes EXC_BAD_ACCESS
    });

    // [photo release] causes EXC_BAD_ACCESS in doStuffToPhoto
}

- (void)doStuffToPhoto:(UIImage*)photo {
    // do stuff
    // [photo release] causes EXC_BAD_ACCESS
} 

【问题讨论】:

  • 附注没有理由在photo 上使用__block,因为photo 没有分配给任何地方
  • [photo release] 放在dispatch_async 块内部的末尾不会导致任何问题。您的问题一定是由您没有显示的内容引起的。

标签: ios memory-management objective-c-blocks


【解决方案1】:

如果我理解正确的文档(查找块存储类型对象和块变量here,不需要保留您的照片变量: "__block 变量存在于变量的词法范围和在变量的词法范围内声明或创建的所有块和块副本之间共享的存储中。因此,存储将如果在帧中声明的块的任何副本在帧结束后仍然存在,则在堆栈帧的破坏中仍然存在"。
但这没有解释为什么你会得到 EXC_BAD_ACCESS。

【讨论】:

  • 你没有抓住重点。 变量(一个指针)存在于共享存储中。 它指向的对象需要被保留和释放。
  • @newacct:感谢您指出这一点。无论如何,我并不完全确定(“如果我理解正确的文档......”)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多