利用RunTime 實(shí)現(xiàn)自動(dòng)化歸檔

一 .概述

一直聽說(shuō)runTime是各種神奇,可以動(dòng)態(tài)添給Category動(dòng)態(tài)綁定屬性,可以自動(dòng)解析Json,還有動(dòng)態(tài)交換方法,還有利用RunTime實(shí)現(xiàn)自動(dòng)化歸檔,今天就跟大家分享下利用RunTime如何實(shí)現(xiàn)自動(dòng)化歸檔.

二.RunTime
  • RunTime簡(jiǎn)稱運(yùn)行時(shí)。就是系統(tǒng)在運(yùn)行的時(shí)候的一些機(jī)制;利用它可以做好多有趣的事情,我就不在這里一一說(shuō)了,利用RunTime 實(shí)現(xiàn)自動(dòng)化歸檔 主要運(yùn)用到下面幾個(gè)方法:
  • 獲取當(dāng)前屬性列表
    OBJC_EXPORT Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
    1.Ivar 定義對(duì)象的實(shí)例變量,包括類型和名字(運(yùn)行時(shí))
    2.第一個(gè)參數(shù)是傳入的是需要獲取屬性列表的類名
    3.第二個(gè)參數(shù)傳入一個(gè)int 類型的地址 需要&地址符號(hào)
  • 返回變量名,char集合,需要進(jìn)行UTF8轉(zhuǎn)碼
    OBJC_EXPORT const char *ivar_getName(Ivar v)

  • 用來(lái)查找當(dāng)前類是否有某個(gè)方法
    OBJC_EXPORT BOOL class_respondsToSelector(Class cls, SEL sel)
    1.第一個(gè)參數(shù) 是需要查找方法的類
    2.需要查找的方法

三.自動(dòng)化歸檔
  • 第一步獲取當(dāng)前類的屬性列表
    // 獲取屬性列表
    - (NSArray *)getPropertyNameList
    {
    unsigned int count;
    // 獲取屬性列表
    objc_property_t *property_list = class_copyIvarList([self class], &count);

       NSMutableArray *property = [NSMutableArray array];
      for (int i = 0; i < count; i++) {
      const char *name = property_getName(property_list[i]);
      NSString *string = [NSString stringWithUTF8String:name];
    
          NSLog(@"當(dāng)前的屬性名字%@",string);
    
         [property addObject:string];
        }
    
           return [property copy];
     }
    
  • 根據(jù)屬性名字,匹配get方法進(jìn)行歸檔
    // 數(shù)據(jù)歸檔
    // 因?yàn)間et方法默認(rèn)省略get關(guān)鍵字所以直接用屬性名字就可以訪問(wèn) get 方法
    - (void)encodeWithCoder:(NSCoder *)aCoder
    {
    // 獲取當(dāng)前屬性列表;
    NSArray *property = [self getPropertyNameList];

     for (NSString *propertyName in property) {
      
      // 因?yàn)間et方法默認(rèn) 是省略get關(guān)鍵字的
      SEL getSEL = NSSelectorFromString(propertyName);
      
      if (class_respondsToSelector([self classForCoder], getSEL)) {
          
          id value = [self performSelector:getSEL];
          
          // 如果value 有值 則進(jìn)行保存
          if (value) {
          
               [aCoder encodeObject:value forKey:propertyName];
              
              NSLog(@"have value name %@", propertyName);
            }   
         }
       }   
    }
    
  • 根據(jù)屬性名字,匹配set方法進(jìn)行解檔處理
    // 協(xié)議方法 解檔數(shù)據(jù)
    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
    NSArray *property = [self getPropertyNameList];

        for (NSString *propertyName in property) {
      
      // 大寫第一個(gè)字母
      NSString *first = [[propertyName substringToIndex:1] uppercaseString];
      
      // 重新拼接方法 setPropertyName 命名規(guī)范 注意: set方法需參數(shù)需要拼接":"
      SEL setSEL = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",first,[propertyName substringFromIndex:1]]);
      
      if (class_respondsToSelector([self class], setSEL)) {
          
          id value = [aDecoder decodeObjectForKey:propertyName];
          
          // 如果value有值 再進(jìn)行賦值
          if (value) {
              
              [self performSelector:setSEL withObject:value];
              
              NSLog(@"解當(dāng)數(shù)據(jù),屬性%@的值%@", propertyName,value);
                }
           }
        }
         return self;
     }
    
  • 總結(jié)
    在實(shí)現(xiàn)方法的過(guò)程中發(fā)現(xiàn)的一個(gè)需要注意的細(xì)節(jié),就是當(dāng)按照屬性名字去匹配setter方法時(shí)由于set方法需要傳遞參數(shù),需要在名字后面拼接 ":" ;因?yàn)樵贠bjective-C中冒號(hào)也是函數(shù)名字的一部分,所以一定要把冒號(hào)給加上.以上三個(gè)方法就可以實(shí)現(xiàn)自動(dòng)歸檔了,剩下的就是一些業(yè)務(wù)封裝了,每個(gè)人都有自己偏愛(ài)的方法,我自己也封裝了一個(gè), 有需要的可以留言.(只需要繼承這個(gè)父類,然后只需要在子類的.h文件里添加屬性就可以實(shí)現(xiàn)自動(dòng)歸檔了)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拨匆,一起剝皮案震驚了整個(gè)濱河市犯犁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歼狼,老刑警劉巖朋截,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逾苫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)枚钓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門铅搓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搀捷,你說(shuō)我怎么就攤上這事星掰。” “怎么了嫩舟?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵蹋偏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我至壤,道長(zhǎng)威始,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任像街,我火速辦了婚禮黎棠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镰绎。我一直安慰自己脓斩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布畴栖。 她就那樣靜靜地躺著随静,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吗讶。 梳的紋絲不亂的頭發(fā)上燎猛,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音照皆,去河邊找鬼重绷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛膜毁,可吹牛的內(nèi)容都是我干的昭卓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瘟滨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼候醒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起杂瘸,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倒淫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胧沫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昌简,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡占业,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纯赎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谦疾。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖犬金,靈堂內(nèi)的尸體忽然破棺而出念恍,到底是詐尸還是另有隱情,我是刑警寧澤晚顷,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布峰伙,位于F島的核電站,受9級(jí)特大地震影響该默,放射性物質(zhì)發(fā)生泄漏瞳氓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一栓袖、第九天 我趴在偏房一處隱蔽的房頂上張望匣摘。 院中可真熱鬧,春花似錦裹刮、人聲如沸音榜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赠叼。三九已至,卻和暖如春违霞,著一層夾襖步出監(jiān)牢的瞬間嘴办,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工葛家, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留户辞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓癞谒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刃榨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弹砚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,719評(píng)論 0 9
  • 對(duì)于從事 iOS 開發(fā)人員來(lái)說(shuō)枢希,所有的人都會(huì)答出【runtime 是運(yùn)行時(shí)】什么情況下用runtime?大部分人能...
    夢(mèng)夜繁星閱讀 3,721評(píng)論 7 64
  • 我們常常會(huì)聽說(shuō) Objective-C 是一門動(dòng)態(tài)語(yǔ)言桌吃,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,195評(píng)論 0 7