美文网首页
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