Runtime的使用

1.可以通過Runtime來遍歷某一個類的所有成員變量和私有屬性,然后可以通過KVC進行自己想要的相關操作

例如 現(xiàn)在想要修改textField在開始編輯時的placeholder文字顏色發(fā)生改變,就可以使用這個方法,拿到textField這個類的私有屬性"_placeholderLabel",然后通過KVC進行修改即可,代碼如下

```

//用來記錄屬性的數(shù)量

unsigned int count = 0;

//賦值類中的所有實例對象的屬性

//返回值是一個屬性列表,可以通過Ivar類型的指針來訪問

Ivar *ivar =? class_copyIvarList([UITextField class], &count);

//利用運行時找出textField的_placeholderLabel屬性,然后用KVC進行賦值

for (unsigned int i = 0; i < count; i++) {

//ivar_getName獲得該指針指向的屬性的名稱

const char *name = ivar_getName(*(ivar + i));

NSLog(@"%s",name);

}

//copy以后內(nèi)存要釋放

free(ivar);

```

2.如果在做數(shù)據(jù)持久化的歸檔解檔的時候,如果一個界面對應的模型所存的屬性很多,那么我們是不是要在以下的方法中寫若干個"encode"和encode方法

```

- (void)encodeWithCoder:(NSCoder *)aCoder;

{

//這里省略若干個

[aCoder encodeObject:value forKey:key];

}

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder

{

//這里省略若干個

self.property = [aDecoder decodeObjectForKey:key];


}


然后用了RunTime以后的代碼無論有多少個屬性,都可以是這樣的

```

- (void)encodeWithCoder:(NSCoder *)aCoder{

unsigned int outCount = 0;

Ivar *vars = class_copyIvarList([self class], &outCount);

for (int i = 0; i < outCount; i ++) {

Ivar var = vars[i];

const char *name = ivar_getName(var);

NSString *key = [NSString stringWithUTF8String:name];

id value = [self valueForKey:key];

[aCoder encodeObject:value forKey:key];

}

}

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{

if (self = [super init]) {

unsigned int outCount = 0;

Ivar *vars = class_copyIvarList([self class], &outCount);

for (int i = 0; i < outCount; i ++) {

Ivar var = vars[i];

const char *name = ivar_getName(var);

NSString *key = [NSString stringWithUTF8String:name];

id value = [aDecoder decodeObjectForKey:key];

[self setValue:value forKey:key];

}

}

return self;

}

```

3.關于category中為什么不能添加成員變量的問題,在RunTime簡介中,說到Class的時候有了說明

class的定義如下

typedef struct objc_class *Class;

```

objc_class 結構體是醬紫的

```

struct objc_class {

Class isa? OBJC_ISA_AVAILABILITY;

#if !__OBJC2__

Class super_class? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

const char *name? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

long version? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

long info? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

long instance_size? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

struct objc_ivar_list *ivars? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

struct objc_method_list **methodLists? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

struct objc_cache *cache? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

struct objc_protocol_list *protocols? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

#endif

} OBJC2_UNAVAILABLE;

```

category的原理就是利用class中的"methodLists"動態(tài)的添加方法,但是并不能利用常規(guī)的方法添加屬性

但是可以利用RunTime來動態(tài)地給一個類添加屬性

```

//setter方法

objc_setAssociatedObject(self,@"name",name,OBJC_ASSOCIATION_COPY_NONATOMIC);

//getter方法

return objc_getAssociatedObject(self,@"name");

```

大概我用到的暫時就這么多,希望能對大家有所幫助

胥鴻儒

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玻靡,隨后出現(xiàn)的幾起案子端盆,更是在濱河造成了極大的恐慌絮爷,老刑警劉巖涡贱,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件践付,死亡現(xiàn)場離奇詭異全封,居然都是意外死亡粘室,警方通過查閱死者的電腦和手機榄檬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衔统,“玉大人鹿榜,你說我怎么就攤上這事$衷” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵喳魏,是天一觀的道長棉浸。 經(jīng)常有香客問我,道長刺彩,這世上最難降的妖魔是什么迷郑? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮创倔,結果婚禮上嗡害,老公的妹妹穿的比我還像新娘。我一直安慰自己畦攘,他們只是感情好霸妹,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著知押,像睡著了一般叹螟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上台盯,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天罢绽,我揣著相機與錄音,去河邊找鬼静盅。 笑死良价,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蒿叠。 我是一名探鬼主播明垢,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼市咽!你這毒婦竟也來了袖外?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤魂务,失蹤者是張志新(化名)和其女友劉穎曼验,沒想到半個月后泌射,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡鬓照,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年熔酷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豺裆。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拒秘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臭猜,到底是詐尸還是另有隱情躺酒,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布蔑歌,位于F島的核電站羹应,受9級特大地震影響,放射性物質發(fā)生泄漏次屠。R本人自食惡果不足惜园匹,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劫灶。 院中可真熱鬧裸违,春花似錦、人聲如沸本昏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涌穆。三九已至紊馏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒲犬,已是汗流浹背朱监。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留原叮,地道東北人赫编。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像奋隶,于是被迫代替她去往敵國和親擂送。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉唯欣,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,709評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言嘹吨,那么這個「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,192評論 0 7
  • Runtime是一套比較底層的純C語言API境氢,包含了很多底層的C語言API蟀拷。在我們平時編寫的OC代碼中碰纬,程序運行時...
    這個年紀的情愫丶閱讀 593評論 5 3
  • 轉載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 731評論 0 2
  • 不要以為你的良善 能夠解開所有的麻 不要以為你的胸膛 是所有頑石期待的家 不要以為你的光亮 能夠驅散所有人心中的黑...
    青梅醉雪閱讀 198評論 1 19