【问题标题】:Access Stack Block from within Block using ARC in Objective-C在 Objective-C 中使用 ARC 从 Block 中访问 Stack Block
【发布时间】:2013-09-04 14:16:10
【问题描述】:

我的问题是关于 Objective-C 中的块:假设以下情况(启用 ARC):

typedef NSString*(^MyBlockType)();
typedef NSString*(^MyReturnBlockType)(MyBlockType);

- (MyReturnBlockType) foo: (MyBlockType) block
{
    return ^NSString*(MyBlockType someBlock) {
        return someBlock();
    };
}

方法foo: 接收的参数block 在方法返回的块中使用。但是,谁对block 有强烈的引用? foo: 是否应该在返回 MyReturnBlockType 块之前复制块?任何见解将不胜感激。

【问题讨论】:

标签: objective-c automatic-ref-counting objective-c-blocks


【解决方案1】:
  1. 参数block 未在代码中的任何位置使用。

  2. 假设您打算在someBlock 中使用block。复制块时保留块捕获的对象指针类型的变量。此外,当块被复制时,被块捕获的指针类型的变量被复制。所以,当someBlock被复制时,block也会被复制。

  3. 在 ARC 中,直接返回的堆栈块在返回之前会自动复制。因此,someBlockblock 将被复制。

  4. 不,foo: 不需要显式复制 block,因为它没有做任何事情来显式存储它(在实例变量或其他东西中)。

【讨论】:

  • 这是一个真正的小问题,但我对文档 re: (2) 的解释是因为 block 在创建 someBlock 时会被捕获,然后它会被复制——就像其他任何事情一样内部将被保留。无需等待someBlock 被复制。我们不同意吗?
  • @Tommy:是的,我们不同意。在复制块本身之前,不会保留/复制捕获的内容。在 MRC 和 ARC 中都是如此,只是有时在 ARC 中复制块时并不明显,因为允许编译器在任何地方添加额外的副本。
  • 既然如此,我已经查阅了文档。这让我同意你的看法。我随后编写了一个测试程序(非 ARC,创建一个可变字符串,创建一个尝试输出字符串的堆栈块,释放字符串,执行块)确认您的阅读。所以谢谢你教我一些东西。
猜你喜欢
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
相关资源
最近更新 更多