objective-c – OBJC_ASSOCIATION_ASSIGN是指原子还是非原子?
发布时间:2020-12-16 07:08:02 所属栏目:百科 来源:网络整理
导读:OBJC_ASSOCIATION_ASSIGN,objc_setAssociatedObject的第四个参数,是指原子还是非原子? 这个枚举定义为 enum { OBJC_ASSOCIATION_ASSIGN = 0,OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,OBJC_ASSOCIATION_COPY_NONATOMIC = 3,OBJC_ASSOCIATION_RETAIN = 01401,O
OBJC_ASSOCIATION_ASSIGN,objc_setAssociatedObject的第四个参数,是指原子还是非原子?
这个枚举定义为 enum { OBJC_ASSOCIATION_ASSIGN = 0,OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,OBJC_ASSOCIATION_COPY_NONATOMIC = 3,OBJC_ASSOCIATION_RETAIN = 01401,OBJC_ASSOCIATION_COPY = 01403 }; 什么是@property(assign,atomic)id idAssignAtomic;? 什么是@property(assign,nonatomic)id idAssignNonatomic;? 解决方法
目前(从iOS 8和OS X 10.10开始),内部所有关联都是原子的.如果我们看一下objc-references.mm的来源,就可以看出这一点:
// class AssociationsManager manages a lock / hash table singleton pair. // Allocating an instance acquires the lock,and calling its assocations() method // lazily allocates it. class AssociationsManager { static spinlock_t _lock; static AssociationsHashMap *_map; // associative references: object pointer -> PtrPtrHashMap. public: AssociationsManager() { spinlock_lock(&_lock); } ~AssociationsManager() { spinlock_unlock(&_lock); } AssociationsHashMap &associations() { if (_map == NULL) _map = new AssociationsHashMap(); return *_map; } }; 具体来说,请注意_lock和_map都是静态的,并定义如下: spinlock_t AssociationsManager::_lock = SPINLOCK_INITIALIZER; AssociationsHashMap *AssociationsManager::_map = NULL; 然后,当两者都获得关联并释放它时,我们会看到以下内容: AssociationsManager manager; AssociationsHashMap &associations(manager.associations()); 这清楚地表明每个关联都是原子的,并且独立于在该过程中存储或检索的所有其他关联. 但请记住,与运行时中的任何内容一样,这些内容在将来的版本中都会发生变化,除了学术目的之外,您不应该依赖此行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |