如何在Objective-C中正确同步对实例变量的访问

时间:2014-07-19 18:10:34

标签: ios objective-c cocoa-touch

我想在Objective-C中同步对BOOL类型的实例变量的访问。我可以对非属性数据成员使用atomic吗?在这种情况下我应该使用@synchronized吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果您不想使用某个属性,那么同步BOOL访问权限的最佳方式就是使用内存屏障。

在每次读取变量之前,请致电__sync_synchronize();。每次写入后,也请致电__sync_synchronize();。这比@synchronized快得多,但对于BOOLshortint,它同样安全。 (在64位平台上,这也适用于64位整数。不过不要使用这种方法和对象指针!)

示例代码:

__sync_synchronize();
if(_myFlag) {
    showUserAlert(@"my flag is set!!! OMG!");
}
//...
if(self.userWantsFlags) {
    _myFlag = YES;
    __sync_synchronize();
}

您当然也可以通过定义atomic属性来封装此行为,并使用它来代替实例变量......

另请参阅:more info on atomic builtins