iOS 内存(系统引用的技术)了解

2021-02-23  本文已影响0人  奋斗的小马达

iOS程序的内存布局


iOS内存布局.png

Tagged Pointer

1、从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储

2、在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值

3、使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中

4、当指针不够存储数据时,才会使用动态分配内存的方式来存储数据

5、objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销

如何判断一个指针是否为Tagged Pointer?
iOS平台,最高有效位是1(第64bit)
Mac平台,最低有效位是1

Tagged Pointer引用前后对比.png

OC对象的内存管理

在iOS中,使用引用计数来管理OC对象的内存

一个新创建的OC对象引用计数默认是1,当引用计数减为0,OC对象就会销毁,释放其占用的内存空间

调用retain会让OC对象的引用计数+1,调用release会让OC对象的引用计数-1

内存管理的经验总结
当调用alloc、new、copy、mutableCopy方法返回了一个对象,在不需要这个对象时,要调用release或者autorelease来释放它
想拥有某个对象,就让它的引用计数+1;不想再拥有某个对象,就让它的引用计数-1

可以通过以下私有函数来查看自动释放池的情况
extern void _objc_autoreleasePoolPrint(void);

copy和mutableCopy

copy和mutableCopy.png
 拷贝的目的:产生一个副本对象,跟源对象互不影响
 修改了源对象,不会影响副本对象
 修改了副本对象,不会影响源对象

 iOS提供了2个拷贝方法
 1.copy,不可变拷贝,产生不可变副本
 2.mutableCopy,可变拷贝,产生可变副本
 
 深拷贝和浅拷贝
 1.深拷贝:内容拷贝,产生新的对象
 2.浅拷贝:指针拷贝,没有产生新的对象
 
上一篇下一篇

猜你喜欢

热点阅读