4

我来自于大量面向 JavaScript 的背景,我正在尽我所能过渡到 Objective-C。自然地,我总是发现自己抓住机会在我的源代码中使用闭包函数,例如:

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

但是,每次我将它记入 Xcode 时,它​​都会警告我:

保留的块属性不会复制块 - 改为使用复制属性

我的理解是,由于 ARC,您不再需要在 Objective-C 中手动保留内容,所以我承认这个警告让我很生气。我假设它指的是我的闭包函数,所以据我所知,它告诉我分配这个变量:

myObject.zoomCallback = someMethod;

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

这有什么负面影响?如果我“复制”该块,它是否允许破坏 someMethod 的所有者,因此在任何时候我提到“self”时,在闭包方法本身内它将不再存在?除非我的闭包方法正在做一些非常琐碎的事情或不引用成员变量或方法的事情,否则我不是几乎总是想要保留该块吗?

4

1 回答 1

3

块在存储之前需要被复制(在某些情况下是在你使用它们之前,但这通常是一段奇怪的代码),因为块是在堆栈上创建的并且需要移动到堆中。如果块没有被复制并且创建它的上下文被破坏,那么它不会总是正常工作。当块捕获一些外部变量(而不是仅使用传递的参数)时就是这种情况。

于 2013-08-04T08:13:11.633 回答