iOS 使用 @autoreleasepool 内存 差异小疑问
2020-08-13 本文已影响0人
天空中的球
创建10000 个 UIView 时 12.3 MB在一个 iOS 开发群中,看到一个小伙伴的疑问(如下图),自己测试了下使用 @autoreleasepool 内存显示的不同点
创建 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);
UIView 和 NSObject 分配的内存大小二、用 @autoreleasepool 创建10000 个 UIView 时为啥 比 NSObject 多的疑惑
从 UIView 和 NSObject 分配的内存大小 大致也可以说明, 为啥 UIView 创建的 对象占用会比 NSObject 大这么多的。
三、@autoreleasepool 到底起作用没的啊 ?
在此刻是没有起作用的,此时我们可以回顾下@autoreleasepool 的作用是:
可以控制应用程序的内存峰值(指应用程序在某个特定时段内的最大内存用量),使得不会处于过高状态!
PS : 根据Using Autorelease Pool Blocks,使用场景如下:
- 写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
- 写循环,循环里面包含了大量临时创建的对象。
- 创建了新的线程。(非Cocoa程序创建线程时才需要)
- 长时间在后台运行的任务。
四、总结点
- UIView 和 NSObject 创建对象的内存大小差异。
- @autoreleasepool 的真实作用到底是啥。
之前是对于这两个有存在理解误差,才这样的。