runtime之變量和屬性

轉(zhuǎn)載文章

1.Ivar

1.1 Ivar的類型

typedef objc_ivar * Ivar;

struct objc_ivar {
    char *ivar_name;          //ivar名稱                          
    char *ivar_type;        //ivar類型
    int ivar_offset;        //ivar偏移量
    #ifdef __LP64__
        int space;
    #endif
}//ObjC2.0 已過時

Ivar是objc_ivar的指針,包含變量名稱,變量類型等成員.

1.2 為類添加Ivar

運(yùn)行時規(guī)定,只能在objc_allocateClassPairobjc_registerClassPair兩個函數(shù)之間為類添加變量
如下所示

//額外空間     未知,通常設(shè)置為 0
Class clazz = objc_allocateClassPair(父類class,類名,額外空間);
//以NSString*為例
//變量size sizeof(NSString)
//對齊     指針類型的為log2(sizeof(NSString*))
//類型     @encode(NSString*)
BOOL flag = class_addIvar(clazz,變量名,變量size,對齊,類型);
objc_registerClassPair(clazz);

1.3 Ivar的相關(guān)操作

//獲取Ivar的名稱
const char *ivar_getName(Ivar v);
//獲取Ivar的類型編碼,
const char *ivar_getTypeEncoding(Ivar v)
//通過變量名稱獲取類中的實(shí)例成員變量
Ivar class_getInstanceVariable(Class cls, const char *name)
//通過變量名稱獲取類中的類成員變量
Ivar class_getClassVariable(Class cls, const char *name)
//獲取指定類的Ivar列表及Ivar個數(shù)
Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
//獲取實(shí)例對象中Ivar的值
id object_getIvar(id obj, Ivar ivar) 
//設(shè)置實(shí)例對象中Ivar的值
void object_setIvar(id obj, Ivar ivar, id value)

1.4 Ivar的使用

//在運(yùn)行時創(chuàng)建繼承自NSObject的People類
Class People = objc_allocateClassPair([NSObject class], "People", 0);
//添加_name成員變量
BOOL flag1 = class_addIvar(People, "_name", sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*));
if (flag1) {
    NSLog(@"NSString*類型  _name變量添加成功");
}
//添加_age成員變量
BOOL flag2 = class_addIvar(People, "_age", sizeof(int), sizeof(int), @encode(int));
if (flag2) {
    NSLog(@"int類型 _age變量添加成功");
}
//完成People類的創(chuàng)建
objc_registerClassPair(People);
unsigned int varCount;
//拷貝People類中的成員變量列表
Ivar * varList = class_copyIvarList(People, &varCount);
for (int i = 0; i<varCount; i++) {
    NSLog(@"%s",ivar_getName(varList[i]));
}
//釋放varList
free(varList);
//創(chuàng)建People對象p1
id p1 = [[People alloc]init];
//從類中獲取成員變量Ivar
Ivar nameIvar = class_getInstanceVariable(People, "_name");
Ivar ageIvar = class_getInstanceVariable(People, "_age");
//為p1的成員變量賦值
object_setIvar(p1, nameIvar, @"張三");
object_setIvar(p1, ageIvar, @33);
//獲取p1成員變量的值
NSLog(@"%@",object_getIvar(p1, nameIvar));
NSLog(@"%@",object_getIvar(p1, ageIvar));

2.Property

2.1 objc_property_t 與 objc_property_attribute_t類型

typedef struct objc_property *objc_property_t;

//特性
typedef struct {
const char *name;           //特性名稱
const char *value;          //特性的值
} objc_property_attribute_t;
特效編碼 具體含義
R readonly
C copy
& retain
N nonatomic
G(name) getter=(name)
S(name) setter = (name)
D @dynamic
W weak
P 用于垃圾回收

特性相關(guān)編碼
屬性的特性字符串 以 T@encode(type) 開頭, 以 V實(shí)例變量名稱 結(jié)尾,中間以特性編碼填充,通過property_getAttributes即可查看

特效編碼 具體含義
R readonly
C copy
& retain
N nonatomic
G(name) getter=(name)
S(name) setter = (name)
D @dynamic
W weak
P 用于垃圾回收

2.2 為類添加Property

BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)

Property的相關(guān)操作

//替換類中的屬性
void class_replaceProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
//獲取類中的屬性
objc_property_t class_getProperty(Class cls, const char *name)
//拷貝類中的屬性列表
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
//獲取屬性名稱
const char *property_getName(objc_property_t property)
//獲取屬性的特性
const char *property_getAttributes(objc_property_t property) 
//拷貝屬性的特性列表
objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount)
//拷貝屬性的特性的值
char *property_copyAttributeValue(objc_property_t property, const char *attributeName)

2.4 Property的使用

Class People = objc_allocateClassPair([NSObject class], "People", 0);
objc_registerClassPair(People);
//T@
objc_property_attribute_t attribute1;
attribute1.name = "T";
attribute1.value=@encode(NSString*);
//Noatomic
objc_property_attribute_t attribute2 = {"N",""};//value無意義時通常設(shè)置為空
//Copy
objc_property_attribute_t attribute3 = {"C",""};
//V_屬性名
objc_property_attribute_t attribute4 = {"V","_name"};
//特性數(shù)組
objc_property_attribute_t attributes[] ={attribute1,attribute2,attribute3,attribute4};
//向People類中添加名為name的屬性,屬性的4個特性包含在attributes中
class_addProperty(People, "name", attributes, 4);
//獲取類中的屬性列表
unsigned int propertyCount;
objc_property_t * properties = class_copyPropertyList(People, &propertyCount);
for (int i = 0; i<propertyCount; i++) {
    NSLog(@"屬性的名稱為 : %s",property_getName(properties[i]));
    NSLog(@"屬性的特性字符串為: %s",property_getAttributes(properties[i]));
}
//釋放屬性列表數(shù)組
free(properties);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驼修,一起剝皮案震驚了整個濱河市墨礁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌级乐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扮惦,死亡現(xiàn)場離奇詭異亲桦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)客峭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門舔琅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人备蚓,你說我怎么就攤上這事《希” “怎么了流昏?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谚鄙。 經(jīng)常有香客問我刁绒,道長,這世上最難降的妖魔是什么膛锭? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任初狰,我火速辦了婚禮,結(jié)果婚禮上奢入,老公的妹妹穿的比我還像新娘媳叨。我一直安慰自己关顷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布痘番。 她就那樣靜靜地躺著平痰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宗雇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天泌神,我揣著相機(jī)與錄音舞虱,去河邊找鬼。 笑死幼苛,一個胖子當(dāng)著我的面吹牛焕刮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播配并,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溉旋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起观腊,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梧油,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后儡陨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體量淌,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫌褪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年笼痛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晃痴。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡倘核,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出紧唱,到底是詐尸還是另有隱情隶校,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布绰疤,位于F島的核電站舞终,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏敛劝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一蛾方、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧上陕,春花似錦桩砰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辕万,卻和暖如春枢步,著一層夾襖步出監(jiān)牢的瞬間沉删,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工醉途, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矾瑰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓隘擎,卻偏偏與公主長得像殴穴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子采幌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355