ToB企服应用市场:ToB评测及商务社交产业平台
标题:
APP内存管理
[打印本页]
作者:
王國慶
时间:
2022-6-23 16:02
标题:
APP内存管理
文章目录
1、iOS程序的内存布局
2、Tagged Pointer 标记指针
问答拓展
3、定时器
3.1、NSTimer、CADisplayLink的使用注意点
3.2、GCD定时器封装
4、OC对象的内存管理
4.1、引用计数的存储
4.2、dealloc
4.3、自动释放池
4.3.1、autorelease 底层结构
4.3.2、AutoreleasePoolPage
1、链表关系
2、实现原理
3、触发逻辑
5、问答拓展
1、iOS程序的内存布局
1、
代码段
:编译之后的代码
2、
数据段
2.1、
字符串常量
:比如NSString *str = @“123”
2.2、
已初始化数据
:已初始化的全局变量、静态变量等
2.3、
未初始化数据
:未初始化的全局变量、静态变量等
3、
堆
:通过alloc、malloc、calloc等动态分配的空间,分配的内存空间地址越来越大
4、
栈
:函数调用开销,比如局部变量。分配的内存空间地址越来越小
2、Tagged Pointer 标记指针
1、从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储.
2、在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值。使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中。(Tagged Pointer指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已。所以,它的内存并不存储在堆中,也不需要 malloc 和 free。)
3、当指针不够存储数据时,才会使用动态分配内存的方式来存储数据。
4、objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销。
5、在内存读取上有着 3 倍的效率,创建时比以前快 106 倍。
优点:
1、减少了 64 位机器下程序的内存占用,还提高了运行效率。完美地解决了小内存对象在存储和访问效率上的问题。
弊病:
1、因为并不是真正的对象,而是一个伪对象,是没有isa指针的。
2、因为不是真正的对象,所以如果你直接访问Tagged Pointer的isa成员的话,在编译时将会得到警告。这时我们只要避免在代码中直接访问对象的 isa 变量,即可避免这个问题。
判断是否为Tagged Pointer:
1、iOS平台,最高有效位是1(第64bit)
2、Mac平台,最低有效位是1
[code]#if TARGET_OS_OSX & __x86_64__ //64-bit Mac tag bit is LSB# define OBJC_MSB_TAGGED_POINTERS 0#else //Everything else tag bit is MSB# define OBJC_MSB_TAGGED_POINTERS 1#endif#if OBJC_MSB_TAGGED_POINTERS# define _OBJC_TAG_MASK (1UL
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4