属性声明的__block属性

时间:2012-07-17 04:14:37

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

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

@property (nonatomic, retain) __block id myProperty;

我怀疑这里的意图是允许从块内部访问属性而不保留self。如何删除__block属性,gcc在这里不支持,但仍能达到同样的效果?

2 个答案:

答案 0 :(得分:12)

我建议你找到一个编译器错误,声明:

@property (nonatomic, retain) __block id myProperty;

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

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

从每个编译器的属性声明中删除__block

[*]如果一个块永远不会被复制到堆中,编译器可能会优化__block变量,而不是将它们移动到堆中。

答案 1 :(得分:4)

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

EG:TypeOfVariable __block *bock_pointer = self.property;

^{ inside the block use bock_pointer }