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 dataWithJSON :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 dataWithJSON :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 dataWithJSON :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 值进行排序输出。而且可以看出,默认输出是不带有排版的。
继续阅读与本文标签相同的文章
-
重科技、重创新、重人才 常德高新区连续两年举办高新技术交流会
2026-05-18栏目: 教程
-
iRobot擦地机器人上新,更有意义的是机器人间互动的实现
2026-05-18栏目: 教程
-
科技的不断进步,分享缤越智能领航系统的使用方法
2026-05-18栏目: 教程
-
谷歌发布首款装有雷达的智能手机
2026-05-18栏目: 教程
-
Win10启用使用Sandbox
2026-05-18栏目: 教程
