美文网首页
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