5

我有一个返回块的方法和另一个使用该方法的方法:

- (MyBlock)blockForParameter:(id)param
{
    MyBlock theBlock = ^(){NSLog(@"Param: %@", param);};
    return theBlock;
}

- (void)methodUser
{
    MyBlock theBlock = [self blockForParameter:something];
    [self.allBlocks addObject:theBlock];
}

问题是,我应该什么时候复制块?我应该在将块返回时blockForParameter复制它,还是在将它添加到数组时复制它?

谢谢

4

2 回答 2

3

如果块“超出创建它们的范围”,则必须复制它们,因此您必须blockForParameter在返回之前复制方法中的块。

编辑:对于 ARC,这不再是真的。例如,请参见Objective-C:ARC 中的块及其参考:

  • 从函数返回块不需要复制块。
  • 将块添加到集合中确实需要块副本。
于 2013-03-19T21:48:18.040 回答
1

分别查看每种方法。

-blockForParameter:中,块文字是从方法返回的。必须复制块才能超出文字的范围。在 MRC 中,您需要返回复制和自动释放的块。在 ARC 中,您无需执行任何操作。

-methodUser中,该块未在该方法中定义;它是从方法调用中接收的。因此,它必须已经被复制(即它不是堆栈块)。因此,当你对它做任何事情时,你不需要addObject:对它做任何事情。

于 2013-03-19T22:56:36.127 回答