属性声明的__block属性
我必须修复一些现有的代码,用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
声明中使用__block
。
EG: TypeOfVariable __block *bock_pointer = self.property;
^{ inside the block use bock_pointer }