美文网首页
atomic 与 nonatomic

atomic 与 nonatomic

作者: 开了那么 | 来源:发表于2020-04-07 10:42 被阅读0次

atomic用于保证属性setter、getter的原子性操作,相当于在getter和setter内部加了线程同步的锁
参看底层代码

get 方法
id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) {
    if (offset == 0) {
        return object_getClass(self);
    }

    // Retain release world
    id *slot = (id*) ((char*)self + offset);
//如果是nonatomic 直接返回
    if (!atomic) return *slot; 
        
    // Atomic retain release world   如果是atomic 加锁,解锁返回
    spinlock_t& slotlock = PropertyLocks[slot];
    slotlock.lock();
    id value = objc_retain(*slot);
    slotlock.unlock();
    
    // for performance, we (safely) issue the autorelease OUTSIDE of the spinlock.
    return objc_autoreleaseReturnValue(value);
}
set 方法
static inline void reallySetProperty(id self, SEL _cmd, id newValue, ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy)
{
    if (offset == 0) {
        object_setClass(self, newValue);
        return;
    }

    id oldValue;
    id *slot = (id*) ((char*)self + offset);

    if (copy) {
        newValue = [newValue copyWithZone:nil];
    } else if (mutableCopy) {
        newValue = [newValue mutableCopyWithZone:nil];
    } else {
        if (*slot == newValue) return;
        newValue = objc_retain(newValue);
    }


 if (!atomic) {
  //如果是nonatomic 直接赋值
        oldValue = *slot;
        *slot = newValue;
    } else {

        spinlock_t& slotlock = PropertyLocks[slot];
        slotlock.lock();
        oldValue = *slot;
        *slot = newValue;        
        slotlock.unlock();
    }
    objc_release(oldValue);
}

相关文章

网友评论

      本文标题:atomic 与 nonatomic

      本文链接:https://www.haomeiwen.com/subject/ufjgphtx.html