runtime總結2:成員變量與屬性

1.基礎數(shù)據(jù)類型

Ivar
是表示實例變量的類型,其實際是一個指向objc_ivar
結構體的指針飒炎,其定義如下:

typedef struct objc_ivar *Ivar;

struct objc_ivar {

char *ivar_name OBJC2_UNAVAILABLE; // 變量名
char *ivar_type OBJC2_UNAVAILABLE; // 變量類型
int ivar_offset OBJC2_UNAVAILABLE; // 基地址偏移字節(jié)

#ifdef __LP64__
int space OBJC2_UNAVAILABLE;
#endif
}

objc_property_t
objc_property_t是表示Objective-C聲明的屬性的類型,其實際是指向objc_property結構體的指針郎汪,其定義如下:

typedefstruct objc_property *objc_property_t;

objc_property_attribute_t

objc_property_attribute_t定義了屬性的特性(attribute)闯狱,它是一個結構體,定義如下:

typedef struct {
const char *name; // 特性名
const char *value; // 特性值
} objc_property_attribute_t;

2.關聯(lián)對象(Associated Object)

關聯(lián)對象可以用在分類添加成員變量扩氢,我們可以把關聯(lián)對象想象成一個Objective-C對象(如字典)耕驰,這個對象通過給定的key連接到類的一個實例上。不過由于使用的是C接口朦肘,所以key是一個void指針(const void *)。我們還需要指定一個內存管理策略

OBJC_ASSOCIATION_ASSIGN
OBJC_ASSOCIATION_RETAIN_NONATOMIC
OBJC_ASSOCIATION_COPY_NONATOMIC
OBJC_ASSOCIATION_RETAIN
OBJC_ASSOCIATION_COPY

當宿主對象被釋放時媒抠,會根據(jù)指定的內存管理策略來處理關聯(lián)對象。如果指定的策略是assign趴生,則宿主釋放時,關聯(lián)對象不會被釋放苍匆;而如果指定的是retain或者是copy,則宿主釋放時浸踩,關聯(lián)對象會被釋放叔汁。我們甚至可以選擇是否是自retain/copy检碗。當我們需要在多個線程中處理訪問關聯(lián)對象的多線程代碼時,這就非常有用了折剃。

static char myKey;
objc_setAssociatedObject(self, &myKey, anObject, OBJC_ASSOCIATION_RETAIN);
在這種情況下,self對象將獲取一個新的關聯(lián)的對象anObject怕犁,且內存管理策略是自動retain關聯(lián)對象,當self對象釋放時因苹,會自動release關聯(lián)對象。另外扶檐,如果我們使用同一個key來關聯(lián)另外一個對象時凶杖,也會自動釋放之前關聯(lián)的對象款筑,這種情況下腾么,先前的關聯(lián)對象會被妥善地處理掉,并且新的對象會使用它的內存解虱。
id anObject = objc_getAssociatedObject(self, &myKey);
我們可以使用objc_removeAssociatedObjects函數(shù)來移除一個關聯(lián)對象,或者使用objc_setAssociatedObject函數(shù)將key指定的關聯(lián)對象設置為nil殴泰。
關聯(lián)對象操作函數(shù)包括以下:

// 設置關聯(lián)對象
void objc_setAssociatedObject ( id object, const void *key, id value, objc_AssociationPolicy policy );

// 獲取關聯(lián)對象
id objc_getAssociatedObject ( id object, const void *key );

// 移除關聯(lián)對象
void objc_removeAssociatedObjects ( id object );

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末浮驳,一起剝皮案震驚了整個濱河市悍汛,隨后出現(xiàn)的幾起案子至会,更是在濱河造成了極大的恐慌,老刑警劉巖奉件,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異县貌,居然都是意外死亡,警方通過查閱死者的電腦和手機窃这,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杭攻,“玉大人,你說我怎么就攤上這事兆解。” “怎么了锅睛?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辣垒。 經常有香客問我,道長勋桶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任例驹,我火速辦了婚禮,結果婚禮上鹃锈,老公的妹妹穿的比我還像新娘。我一直安慰自己屎债,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布扔茅。 她就那樣靜靜地躺著秸苗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惊楼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天檀咙,我揣著相機與錄音,去河邊找鬼弧可。 笑死,一個胖子當著我的面吹牛棕诵,可吹牛的內容都是我干的。 我是一名探鬼主播校套,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笛匙!你這毒婦竟也來了侨把?” 一聲冷哼從身側響起妹孙,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蠢正,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡萨西,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年旭旭,在試婚紗的時候發(fā)現(xiàn)自己被綠了谎脯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片持寄。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稍味,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情模庐,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布掂碱,位于F島的核電站,受9級特大地震影響疼燥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜醉者,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望立磁。 院中可真熱鬧,春花似錦息罗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挨摸。三九已至,卻和暖如春得运,著一層夾襖步出監(jiān)牢的瞬間膝蜈,已是汗流浹背熔掺。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工饱搏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留置逻,地道東北人推沸。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像券坞,于是被迫代替她去往敵國和親鬓催。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容