- (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

以上是我的代码和两个问题。
  • OSAtmonicCompareAndSwap32实际在做什么?
  • 如何删除警告?
  • 最佳答案

    OSAtmonicCompareAndSwap32实际在做什么?

    它自动比较currentCount和_activityCount,如果它们相等,则将_activityCount设置为MIN(currentCount - 1, currentCount)

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

    因此,基本上它执行原子减1。用更少的代码即可完成相同的工作。

    如何删除警告?

    _activityCount必须为int32_t,或者

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

    关于ios - OSAtmonicCompareAndSwap32给我一个警告,我不知道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20288695/

    10-11 02:28