MJExtension中你可能不知道的一些点

MJExtension 应该是经常用到的开源库,其解析功能的确很强大。当然,这个在面试中也可能会问到,今天就说下关于这个库的三点不常见的知识。
  • 关联对象:类关联对象和对象关联对象。
  • 缓存
  • kNilOptions

对象关联对象还是比较常用的,不管是第三方还是自己写代码,一般在分类中需要全局存储某个字段,通常会使用对象关联属性,这个时候该字段的生命周期就会延长,以便进行后续操作。所以,这个时候该字段对应的内存空间会长时间保存,也就会导致内存的增加。

类关联对象还是比较少用的,但是 MJExtension 恰好就是使用这种方式设置缓存的。这种情况下,保留的数据还是需要内存占用的,所以导致内存增加也是无疑了。

问题来了,如果每个类都使用缓存,那不就浪费资源了嘛?

不要着急,接下来看看 MJExtension 中缓存的使用。


MJExtension 封装的很好,这个是事实。根据源码,使用缓存的类包括 MJPropertyMJPropertyType

首先说明下这两个类的作用。

MJProperty 用于表示每个属性对应的信息,包括成员属性、属性名字、属性类型、源类以及一些方法。

MJPropertyType 用于表示每个属性类型,包括 key的名字、对应的类型(数组/字典)以及从对象取值的方法。

其实,这两个类算是基础类,颗粒度很小,复用率还是很高的。所以,这里使用类关联对象的方式缓存以便提升效率。

但是,如果你的 appmodel 的复用率很低,这里的缓存就不会起什么作用,反而造成了内存的多余消耗。


既然是数据解析,就涉及到了数据转 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 值进行排序输出。而且可以看出,默认输出是不带有排版的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值