【发布时间】:2013-08-04 02:46:02
【问题描述】:
我有大量的面向 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”时,在闭包方法本身内它将不再存在?除非我的闭包方法正在做一些非常琐碎的事情或不引用成员变量或方法的事情,否则我不是几乎总是想要保留该块吗?
【问题讨论】:
-
块不应该被保留,它们需要被复制。将
retain替换为copy以解决此问题。 -
如果你使用 ARC,你也应该写
strong而不是retain。 -
但是为什么,有什么不同,有什么不同呢?
-
@Skippy:xcode 标签在这里不合适,因为它是一个 IDE,而且 Macmee 正在讨论运行时特性。在建议的编辑中删除该标签是否合适(是否太小)是一个悬而未决的问题。
标签: objective-c automatic-ref-counting closures retain-cycle