OSAtmonicCompareAndSwap32给了我一个我无法弄清楚的警告

时间:2013-11-29 15:11:02

标签: ios ios7 nsinteger

- (void)decrementActivityCount {
    [self willChangeValueForKey:@"activityCount"];
    bool success;
    do {
        int32_t currentCount = (int32_t)_activityCount;
        success = OSAtomicCompareAndSwap32(currentCount, MIN(currentCount - 1, currentCount), &_activityCount); 
        //Incompatible pointer types passing 'NSInteger *' (aka 'long *') to parameter of type 'volatile int32_t *' (aka 'volatile int *')
    } while(!success);
    [self didChangeValueForKey:@"activityCount"];
    [self updateNetworkActivityIndicatorVisibilityDelayed];
}

_activityCount是一个NSInteger

以上是我的代码和两个问题。

  1. OSAtmonicCompareAndSwap32实际上在做什么?
  2. 如何删除警告?

1 个答案:

答案 0 :(得分:1)

  

OSAtmonicCompareAndSwap32实际上在做什么?

它原子地比较 currentCount 和_ activityCount ,如果它们相等,则将_ activityCount 设置为MIN(currentCount - 1, currentCount)。< / p>

如果比较相等,则返回true。

因此,基本上它执行的原子减量为1.使用较少的代码可以实现相同的目的。

  

如何删除警告?

_ activityCount 必须是int32_t,或者

使用64位整数和CompareAndSwap的64位变体:

OSAtomicCompareAndSwap64