用runtime遍歷用戶屬性的方法與傳統(tǒng)方法的比較

初始化方法

#import "User.h"
#import <objc/message.h>

@implementation User

- (id) initWithDicionary:(NSDictionary*)dic {
    self = [super init];
    if (self) {
        //更新用戶信息:
        [self updateUserInfo:dic];
    }
    return self;
}

更新用戶信息

- (void)updateUserInfo:(NSDictionary *)dic {
    id userId =  [[dic objectForKey:@"data"] objectForKey:@"user_id"];
    if ([userId isKindOfClass:[NSNull class]]) self.user_id = @"0000";
    self.user_id = userId;
    
    NSString *nickName = [[dic objectForKey:@"data"] objectForKey:@"nickname"];
    if ([nickName isKindOfClass:[NSNull class]]) self.nickname = @"";
    self.nickname = nickName;
    
    id mobile = [[dic objectForKey:@"data"] objectForKey:@"mobile"];
    if ([mobile isKindOfClass:[NSNull class]]) self.moblie = @"0000";
    self.moblie = mobile;
    
    id lng = [[dic objectForKey:@"data"] objectForKey:@"lng"];
    if ([lng isKindOfClass:[NSNull class]]) self.lng = @"00.00";
    self.lng = lng;
    
    id lat = [[dic objectForKey:@"data"] objectForKey:@"lat"];
    if ([lat isKindOfClass:[NSNull class]]) self.lat = @"00.00";
    self.lat = lat;
    
    NSString *avater = [[dic objectForKey:@"data"] objectForKey:@"avatar"];
    if ([avater isKindOfClass:[NSNull class]]) self.avatar = @"";
    self.avatar = avater;
    
    NSString *token = [dic objectForKey:@"token"];
    if ([token isKindOfClass:[NSNull class]]) self.token = @"";
    self.token = token;
    
    NSString *describe = [[dic objectForKey:@"data"] objectForKey:@"describe"];
    if ([describe isKindOfClass:[NSNull class]]) self.describe = @"";
    self.describe = describe;
    
    NSString *signature = [[dic objectForKey:@"data"] objectForKey:@"signature"];
    if ([signature isKindOfClass:[NSNull class]]) self.signature = @"";
    self.signature = signature;
    
    NSString *gender = [[dic objectForKey:@"data"] objectForKey:@"gender"];
    if ([gender isKindOfClass:[NSNull class]])  self.gender = @"";
    self.gender = gender;
    
    NSString *school = [[dic objectForKey:@"data"] objectForKey:@"school"];
    if ([school isKindOfClass:[NSNull class]]) self.school = @"";
    self.school = school;
    
    NSString *department = [[dic objectForKey:@"data"] objectForKey:@"department"];
    if ([department isKindOfClass:[NSNull class]]) self.department = @"";
    self.department = department;
    
    NSString *start_time = [[dic objectForKey:@"data"] objectForKey:@"start_time"];
    if ([start_time isKindOfClass:[NSNull class]]) self.start_time = @"";
    self.start_time = start_time;
    
    NSString *education_id = [[dic objectForKey:@"data"] objectForKey:@"education_id"];
    if ([education_id isKindOfClass:[NSNull class]])  self.education_id = @"";
    self.education_id = education_id;
}

runtime遍歷屬性

/*
 對象歸檔解檔改為運行時進(jìn)行:
 
 */
#pragma mark - 對象歸檔
- (void)encodeWithCoder:(NSCoder *)aCoder {
    unsigned int count = 0 ;
    Ivar *ivars = class_copyIvarList([User class], &count) ;
    for (int i = 0; i < count; i++) {
        Ivar ivar = ivars[i] ;
        const char *propertyName = ivar_getName(ivar) ;
        NSString *key = [[NSString alloc] initWithUTF8String:propertyName] ;
        [aCoder encodeObject:[self valueForKey:key] forKey:key] ;
    }
}

#pragma mark - 對象解檔
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super init] ;
    if (self) {
        unsigned int count = 0 ;
        Ivar *ivars = class_copyIvarList([User class], &count) ;
        for (int i = 0; i < count; i++) {
            Ivar ivar = ivars[i] ;
            const char *propertyName = ivar_getName(ivar) ;
            NSString *key = [[NSString alloc] initWithUTF8String:propertyName] ;
            id value = [aDecoder decodeObjectForKey:key] ;
            [self setValue:value forKey:key] ;
        }
    }
    return self ;
}

原始方法一個一個去寫

// 歸檔(NSCoding 協(xié)議方法):
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.user_id forKey:@"user_id"];
    [aCoder encodeObject:self.nickname forKey:@"nickname"];
    [aCoder encodeObject:self.moblie forKey:@"moblie"];
    [aCoder encodeObject:self.lng forKey:@"lng"];
    [aCoder encodeObject:self.lat forKey:@"lat"];
    [aCoder encodeObject:self.token forKey:@"token"];
    [aCoder encodeObject:self.avatar forKey:@"avatar"];
    [aCoder encodeObject:self.describe forKey:@"describe"];
    [aCoder encodeObject:self.signature forKey:@"signature"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
    [aCoder encodeObject:self.school forKey:@"school"];
    [aCoder encodeObject:self.department forKey:@"department"];
    [aCoder encodeObject:self.start_time forKey:@"start_time"];
    [aCoder encodeObject:self.education_id forKey:@"education_id"];
}


// 反歸檔(NSCoding 協(xié)議方法):
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
        self.user_id = [aDecoder decodeObjectForKey:@"user_id"];
        self.nickname = [aDecoder decodeObjectForKey:@"nickname"];
        self.moblie = [aDecoder decodeObjectForKey:@"moblie"];
        self.lng = [aDecoder decodeObjectForKey:@"lng"];
        self.lat = [aDecoder decodeObjectForKey:@"lat"];
        self.token = [aDecoder decodeObjectForKey:@"token"];
        self.avatar = [aDecoder decodeObjectForKey:@"avatar"];
        self.describe = [aDecoder decodeObjectForKey:@"describe"];
        self.signature = [aDecoder decodeObjectForKey:@"signature"];
        self.gender = [aDecoder decodeObjectForKey:@"gender"];
        self.school = [aDecoder decodeObjectForKey:@"school"];
        self.department = [aDecoder decodeObjectForKey:@"department"];
        self.start_time = [aDecoder decodeObjectForKey:@"start_time"];
        self.education_id = [aDecoder decodeObjectForKey:@"education_id"];

    }
    return self;
}

重寫description方法打印

- (NSString *)description {
    return [NSString stringWithFormat:@"%@, %@, %@, %@, %@, %@, %@", _user_id, _nickname, _avatar, _moblie, _token, _lat, _lng];
}

@end

愿編程讓這個世界更美好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踏揣,老刑警劉巖恼琼,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绸狐,死亡現(xiàn)場離奇詭異花吟,居然都是意外死亡胞锰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門政基,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贞铣,“玉大人,你說我怎么就攤上這事沮明≡樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵荐健,是天一觀的道長酱畅。 經(jīng)常有香客問我,道長江场,這世上最難降的妖魔是什么纺酸? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮址否,結(jié)果婚禮上餐蔬,老公的妹妹穿的比我還像新娘。我一直安慰自己佑附,他們只是感情好樊诺,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著音同,像睡著了一般词爬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上权均,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天顿膨,我揣著相機(jī)與錄音,去河邊找鬼叽赊。 笑死恋沃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的必指。 我是一名探鬼主播囊咏,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼取劫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起研侣,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谱邪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后庶诡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惦银,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扯俱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片书蚪。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迅栅,靈堂內(nèi)的尸體忽然破棺而出殊校,到底是詐尸還是另有隱情,我是刑警寧澤读存,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布为流,位于F島的核電站,受9級特大地震影響让簿,放射性物質(zhì)發(fā)生泄漏敬察。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一尔当、第九天 我趴在偏房一處隱蔽的房頂上張望莲祸。 院中可真熱鬧,春花似錦椭迎、人聲如沸锐帜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抹估。三九已至,卻和暖如春弄兜,著一層夾襖步出監(jiān)牢的瞬間药蜻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工替饿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留语泽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓视卢,卻偏偏與公主長得像踱卵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子据过,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉惋砂,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評論 0 9
  • 123.繼承 一個類可以從另外一個類繼承方法,屬性和其他特征。當(dāng)一個類繼承另外一個類時, 繼承類叫子類, 被繼承的...
    無灃閱讀 1,392評論 2 4
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評論 25 707
  • Given an array of strings, group anagrams together. Note:...
    matrxyz閱讀 145評論 0 0
  • 想見你,于是便來了鳞芙。漫無目的地游蕩眷柔,是心的短途旅行期虾。從熟悉的地方逃離,去遠(yuǎn)方感受驟雨初歇古樹新芽的清新氣息驯嘱。 陰雨...
    海心海言閱讀 630評論 4 7