我必须修复一些使用 LLVM(在 iOS 上)构建得很好的现有代码,以便它也可以使用 llvm-gcc-4.2 构建。我已经完成了几乎所有的事情,除了在几个地方发现的这种模式:
@property (nonatomic, retain) __block id myProperty;
我怀疑这里的意图是允许从块内部访问该属性而不保留self
. 如何删除__block
gcc 此处不支持的属性,但仍能达到相同的效果?
我必须修复一些使用 LLVM(在 iOS 上)构建得很好的现有代码,以便它也可以使用 llvm-gcc-4.2 构建。我已经完成了几乎所有的事情,除了在几个地方发现的这种模式:
@property (nonatomic, retain) __block id myProperty;
我怀疑这里的意图是允许从块内部访问该属性而不保留self
. 如何删除__block
gcc 此处不支持的属性,但仍能达到相同的效果?
我建议你发现了一个编译器错误,即声明:
@property (nonatomic, retain) __block id myProperty;
是没有意义的。限定符用于本地(堆栈分配)变量,__block
因此它们通过引用传递给块,因此可以更新它们,并且通常[*]存储在堆上而不是堆栈上。
因此,限定符__block
在与对象实例有关的属性声明上没有任何意义,这些对象实例在 Obj-C 中始终是堆分配的。
只需__block
从属性声明中删除 - 对于每个编译器。
[*] 如果一个块从未被复制到堆中,编译器可能会优化 __block 变量并且也不会将它们移动到堆中。
在块中使用变量之前,创建一个类型为 的本地指针__block
。永远不要__block
在@property
声明中使用。
例如:TypeOfVariable __block *bock_pointer = self.property;
^{ inside the block use bock_pointer }