美文网首页
iOS 使用 @autoreleasepool 内存 差异小疑问

iOS 使用 @autoreleasepool 内存 差异小疑问

作者: 天空中的球 | 来源:发表于2020-08-13 17:06 被阅读0次

    在一个 iOS 开发群中,看到一个小伙伴的疑问(如下图),自己测试了下使用 @autoreleasepool 内存显示的不同点

    创建10000 个 UIView 时 12.3 MB
    创建 10000 个 NSObject 对象时 9.4 MB
    正常情况的 9.4MB
    • 用 @autoreleasepool 创建10000 个 UIView 时 ==> 12.3M
    • 用 @autoreleasepool 创建 10000 个 NSObject 对象时 ==> 9.4 MB
    • 正常 9.4 MB
    一、用 @autoreleasepool 创建10000 个 NSObject 时,干了啥
    @autoreleasepool {
        id obj = [[NSObject alloc] init];
    }
    

    转换成 ==> 编译器的模拟代码:

    id pool = objc_autoreleasePoolPush();
    id = objc_msgSend(NSObject,@selector(alloc));
    objc_msgSend(obj,@selector(init));
    objc_autorelease(obj);
    objc_autoreleasePoolPop(pool);
    
    二、用 @autoreleasepool 创建10000 个 UIView 时为啥 比 NSObject 多的疑惑
    UIView 和 NSObject 分配的内存大小
    从 UIView 和 NSObject 分配的内存大小 大致也可以说明, 为啥 UIView 创建的 对象占用会比 NSObject 大这么多的。
    三、@autoreleasepool 到底起作用没的啊 ?

    在此刻是没有起作用的,此时我们可以回顾下@autoreleasepool 的作用是:
    可以控制应用程序的内存峰值(指应用程序在某个特定时段内的最大内存用量),使得不会处于过高状态!

    PS : 根据Using Autorelease Pool Blocks,使用场景如下:

    • 写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
    • 写循环,循环里面包含了大量临时创建的对象。
    • 创建了新的线程。(非Cocoa程序创建线程时才需要)
    • 长时间在后台运行的任务。
    四、总结点
    • UIView 和 NSObject 创建对象的内存大小差异。
    • @autoreleasepool 的真实作用到底是啥。

    之前是对于这两个有存在理解误差,才这样的。

    参考

    相关文章

      网友评论

          本文标题:iOS 使用 @autoreleasepool 内存 差异小疑问

          本文链接:https://www.haomeiwen.com/subject/wozbdktx.html