MJExtension
应该是经常用到的开源库,其解析功能的确很强大。当然,这个在面试中也可能会问到,今天就说下关于这个库的三点不常见的知识。
- 关联对象:类关联对象和对象关联对象。
- 缓存
kNilOptions
对象关联对象还是比较常用的,不管是第三方还是自己写代码,一般在分类中需要全局存储某个字段,通常会使用对象关联属性,这个时候该字段的生命周期就会延长,以便进行后续操作。所以,这个时候该字段对应的内存空间会长时间保存,也就会导致内存的增加。
类关联对象还是比较少用的,但是 MJExtension
恰好就是使用这种方式设置缓存的。这种情况下,保留的数据还是需要内存占用的,所以导致内存增加也是无疑了。
问题来了,如果每个类都使用缓存,那不就浪费资源了嘛?
不要着急,接下来看看 MJExtension
中缓存的使用。
MJExtension
封装的很好,这个是事实。根据源码,使用缓存的类包括 MJProperty
、 MJPropertyType
。
首先说明下这两个类的作用。
MJProperty
用于表示每个属性对应的信息,包括成员属性、属性名字、属性类型、源类以及一些方法。
MJPropertyType
用于表示每个属性类型,包括 key
的名字、对应的类型(数组/字典)以及从对象取值的方法。
其实,这两个类算是基础类,颗粒度很小,复用率还是很高的。所以,这里使用类关联对象的方式缓存以便提升效率。
但是,如果你的 app
中 model
的复用率很低,这里的缓存就不会起什么作用,反而造成了内存的多余消耗。
既然是数据解析,就涉及到了数据转 json
,源码中有个参数 kNilOptions
之前没有接触过。
平时使用系统方法进行 json
解析,一般使用 NSJSONWritingPrettyPrinted
作为参数。
而 MJExtension
中使用 kNilOptions
作为参数,二者有什么区别呢?看下面代码:
- (void)test_NSJSONWritingPrettyPrinted
{
NSDictionary *dic = @{
@"1" : @"2",
@"3" : @"4"
};
NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"test_NSJSONWritingPrettyPrinted -- %@", s);
// 打印日志
/*
2018-12-17 18:08:49.373861+0800 MJExtensionExample[65287:646046] test_NSJSONWritingPrettyPrinted -- {
"1" : "2",
"3" : "4"
}
*/
}
- (void)test_kNilOptions
{
NSDictionary *dic = @{
@"1" : @"2",
@"3" : @"4"
};
NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:kNilOptions error:nil];
NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"test_kNilOptions -- %@", s);
// 打印日志
/*
2018-12-17 18:09:11.768635+0800 MJExtensionExample[65313:646619] test_kNilOptions -- {"1":"2","3":"4"}
*/
}
区别就是排版的问题。
既然说到 NSJSONWritingPrettyPrinted
,再看看 NSJSONWritingSortedKeys
。代码如下:
- (void)test_NSJSONWritingSortedKeys
{
NSDictionary *dic = @{
@"3" : @"4",
@"a" : @"b",
@"1" : @"2",
};
if (@available(iOS 11.0, *)) {
NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingSortedKeys error:nil];
NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"test_NSJSONWritingSortedKeys -- %@", s);
} else {
// Fallback on earlier versions
}
// 打印日志
/*
2018-12-17 18:13:34.814269+0800 MJExtensionExample[65527:650368] test_NSJSONWritingSortedKeys -- {"1":"2","3":"4","a":"b"}
*/
}
这里就是对字典的 key
值进行排序输出。而且可以看出,默认输出是不带有排版的。