runtime獲取所有的屬性

當(dāng)一個(gè)Model類的屬性很多的時(shí)候我們需要寫很多重復(fù)的代碼,因此我們就可以用runtime獲取所有的屬性

記住要導(dǎo)入 #import <objc/message.h>

1.序列化

//編碼
- (void)encodeWithCoder:(NSCoder *)aCoder {
    //一般寫法
//    [aCoder encodeObject:_name forKey:@"name"];
//    [aCoder encodeObject:@(_age) forKey:@"age"];
//    [aCoder encodeObject:_phone forKey:@"phone"];

    //runtime
    unsigned int count = 0;
    Ivar * ivars = class_copyIvarList([Person class], &count);//獲取所以屬性
    for (int i = 0; i< count; i++) {
        Ivar ivar = ivars[i];//屬性名稱
        const char * name = ivar_getName(ivar);
        NSString *key = [NSString stringWithUTF8String:name];//C-->OC
        id value = [self valueForKey:key];//取值
        [aCoder encodeObject:value forKey:key];
    }
    free(ivars);//釋放
}

2.反序列化

//反編碼
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        //一般寫法
//        self.name = [aDecoder decodeObjectForKey:@"name"];
//        self.phone = [aDecoder decodeObjectForKey:@"phone"];
//        self.age = [[aDecoder decodeObjectForKey:@"age"] intValue];
        //runtime
        unsigned int count = 0;
        Ivar * ivars = class_copyIvarList([Person class], &count);//獲取所以屬性
        for (int i = 0; i< count; i++) {
            Ivar ivar = ivars[i];//屬性名稱
            const char * name = ivar_getName(ivar);
            NSString *key = [NSString stringWithUTF8String:name];//C-->OC
            id value = [aDecoder decodeObjectForKey:key];//取值
            [self setValue:value forKey:key];//賦值
        }
        free(ivars);//釋放
        
    }
    return self;
}

使用

//歸檔
    Person *p1 = [[Person alloc]init];
    p1.name   =  @"SUN";
    p1.age    =  25;
    p1.phone =  @"110";
    [NSKeyedArchiver archiveRootObject:p1 toFile:[NSTemporaryDirectory() stringByAppendingPathComponent:@"person.data"]];
    //檢測(cè)是否歸檔成功
    BOOL result = [[NSFileManager defaultManager] fileExistsAtPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"person.data"]];
    if (result) {
        NSLog(@"歸檔OK");
    }else{
        NSLog(@"歸檔NO");
    }

網(wǎng)絡(luò)請(qǐng)求解析數(shù)據(jù)也經(jīng)常用到

當(dāng)然可以使用小碼哥的 MJExtension
[Person mj_objectWithKeyValues:dict];

-(instancetype)initWithDic:(NSDictionary *)dic{
    if (self = [super init]) {
        //一般寫法
//        self.name = dic[@"name"];
//        self.phone = dic[@"phone"];
//        self.age = [dic[@"age"] intValue];
        //runtime
        unsigned int count = 0;
        Ivar * ivars = class_copyIvarList([Person class], &count);//獲取所以屬性
        for (int i = 0; i< count; i++) {
            Ivar ivar = ivars[i];//屬性名稱
            const char * name = ivar_getName(ivar);
            NSString *key = [NSString stringWithUTF8String:name];//C-->OC
            id value = dic[[key substringFromIndex:1]];//取值
            [self setValue:value forKey:key];//賦值
        }
        free(ivars);//釋放
    }
    return self;
    
}

基本上所有類似重復(fù)的代碼都可以這種方式
Demo:https://github.com/Sunkangp/runtime

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 對(duì)于從事 iOS 開(kāi)發(fā)人員來(lái)說(shuō),所有的人都會(huì)答出【runtime 是運(yùn)行時(shí)】什么情況下用runtime?大部分人能...
    夢(mèng)夜繁星閱讀 3,812評(píng)論 7 64
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,242評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,656評(píng)論 1 32
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,203評(píng)論 3 119
  • 有些事想開(kāi)了,你就會(huì)明白,在這個(gè)世界上,你就是你,你痛,痛你自己,你累,累你自己,就算有人同情你,那又怎樣,最后收...
    Life_53a9閱讀 301評(píng)論 3 1

友情鏈接更多精彩內(nèi)容