【问题标题】:"Retain'ed block property does not copy the block - use copy attribute instead“保留的块属性不会复制块 - 改用复制属性
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-12-22
    • 2011-08-16
    • 2011-08-16
    • 2012-04-13
    • 1970-01-01
    • 2023-04-09
    • 2012-05-18
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多