無業可守 創新圖強
living innovation

vinbet浩博手機版app

當前位置:首頁 > vinbet浩博手機版app >

【OC底層】AssociatedObject 關聯對象

日期:2019-08-12

如何實現給分類“添加成員變量”?

默認情況下,因為分類底層結構的限制,不能添加成員變量到分類中。但可以通過關聯對象來間接實現關聯對象提供了以下API

  1> 添加關聯對象

  void objc_setAssociatedObject(id object, const void * key,   id value, objc_AssociationPolicy policy)

  2> 獲得關聯對象

  id objc_getAssociatedObject(id object, const void * key)

  3> 移除所有的關聯對象

  void objc_removeAssociatedObjects(id object)

?

key的常見用法

?

objc_AssociationPolicy修飾符

?

?

給分類添加屬性實例

假如已經有一個 XGPerson的類,現在我們需要擴展這個類,并且添加一個 age 屬性

#import "XGPerson.h"// 分類屬性是不會生成 getset 方法的,如果不重寫這兩個方法,就無法正常使用屬性@interface XGPerson (Test)@property (nonatomic,assign) int age;@end

#import "XGPerson+Test.h"#import <objc/runtime.h>@implementation XGPerson (Test)- (void)setAge:(int)age{ // @selector(age) 這個參數只要傳一個地址指針就可以 objc_setAssociatedObject(self, @selector(age), @(age), OBJC_ASSOCIATION_ASSIGN);}- (int)age{ // 隱式參數 // _cmd = @selectior(age) return [objc_getAssociatedObject(self, _cmd) intValue];}

調用:

XGPerson* p1 = [[XGPerson alloc]init]; p1.name = @"p1"; p1.age = 18; XGPerson* p2 = [[XGPerson alloc]init]; p2.name = @"p2"; p2.age = 20; NSLog(@"p1Name:%@ p1Age:%i----p2Name:%@ p2Age:%i",p1.name,p1.age,p2.name,p2.age);

輸出:

2018-11-29 14:20:38.666084+0800 關聯對象(增加分類屬性)[1923:87124] p1Name:p1 p1Age:18----p2Name:p2 p2Age:20

?

關聯對象的原理

實現關聯對象技術的核心對象有

  AssociationsManager  AssociationsHashMap  ObjectAssociationMap  ObjcAssociation

?objc4源碼解讀:objc-references.mm

?  

關聯對象存儲結構圖
    關聯對象并不是存儲在被關聯對象本身內存中關聯對象存儲在全局的統一的一個AssociationsManager中設置關聯對象為nil,就相當于是移除關聯對象

?

天天看片