當(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