“保留块属性不会复制块 - 而是使用复制属性

时间:2013-08-04 02:46:03

标签: objective-c automatic-ref-counting closures retain-cycle

我来自一个沉重的面向JavaScript的背景,我正在尽可能地过渡到Objective-C。当然,我总是发现自己有机会在我的源代码中使用闭包函数,例如:

@property (nonatomic, retain) void (^zoomCallback)(NSInteger width, NSInteger height, NSString *url);

但是,每当我将其记录到Xcode中时,它都会警告我:

  

保留块属性不会复制块 - 而是使用复制属性

据我所知,由于ARC,你不再需要在Objective-C中手动保留东西了,所以我肯定会被这个警告所抛弃。我在假设它是指我的闭包函数,所以据我所知,它告诉我分配这个变量:

myObject.zoomCallback = someMethod;

还会导致someMethod被保留,因此someMethod的所有者继续存在?我做对了吗?

这有什么负面影响?如果我“复制”该块,它不会允许someMethod的所有者被销毁,因此在封闭方法本身内,任何时候我提到“自我”它将不再存在?除非我的闭包方法做了非常微不足道的事情或者没有引用成员变量或方法的东西,否则我几乎总是想要保留块?

1 个答案:

答案 0 :(得分:3)

块需要在存储之前进行复制(在某些情况下,在使用它们之前,但通常是一些奇怪的代码),因为块在堆栈上创建并需要移动到堆中。如果未复制块,并且销毁它的上下文将被销毁,则它将无法始终正常工作。当块捕获一些外部变量(而不是仅使用传递的参数)时就是这种情况。