【问题标题】:__block attribute on property declarations__block 属性声明中的属性
【发布时间】:2023-03-08 21:04:01
【问题描述】:

我必须修复一些使用 LLVM(在 iOS 上)构建得很好的现有代码,以便它也可以使用 llvm-gcc-4.2 构建。我已经完成了几乎所有的事情,除了在几个地方发现的这种模式:

@property (nonatomic, retain) __block id myProperty;

我怀疑这里的意图是允许从块内部访问该属性而不保留self。怎么去掉__block属性,gcc这里不支持,但还是一样的效果?

【问题讨论】:

  • 我很确定您不需要 __block 属性...它用于堆栈分配的本地人。无论如何,试试吧。如果没有错误,你就可以了。
  • 来自 Clang 语言规范:“除了新的块类型,我们还引入了一个新的存储限定符 __block,用于局部变量”参见。 opensource.apple.com/source/clang/clang-137/src/tools/clang/…

标签: objective-c ios gcc llvm llvm-gcc


【解决方案1】:

我建议你发现了一个编译器错误,即声明:

@property (nonatomic, retain) __block id myProperty;

毫无意义。 __block 限定符用于本地(堆栈分配)变量,因此它们通过引用传递给块,因此可以更新它们,并且通常[*] 存储在堆上而不是堆栈上。

因此,限定符 __block 在与对象实例相关的属性声明中没有任何意义,这些对象实例在 Obj-C 中始终是堆分配的。

只需从属性声明中删除__block - 对于每个编译器。

【讨论】:

    【解决方案2】:

    在块中使用变量之前,创建一个__block 类型的本地指针。永远不要在 @property 声明中使用 __block

    例如:TypeOfVariable __block *bock_pointer = self.property;

    ^{ inside the block use bock_pointer }

    【讨论】:

    • 是的,这是我最初的想法,但我想知道是否有另一种方法可以做到这一点,而无需触及访问所述属性的代码(通过另一个属性属性或 gcc 特定的 __attribute__() 也许? )…
    • 为什么不在块中使用self.property
    • 为什么不应该在块中使用属性?请解释或提供参考
    • 在块中访问 self 将保留 self。
    猜你喜欢
    • 2012-11-23
    • 2015-09-26
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多