标题:
内存管理(5)
[打印本页]
作者:
look_w
时间:
2019-3-11 20:38
标题:
内存管理(5)
四.对象的内存管理
在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);
1.引用计数器的存储
在64bit中,引用计数可以直接存储在优化过的isa指针中。
isa指针中的extra_rc 存储引用计数器,= 引用计数器的值 – 1;
如果isa中不够存储,has_sidetable_rc = 1,就会存储到sideTable的refcnts中(refcnts是一个存放着对象引用计数的散列表)
SideTable
2.weak指针的原理
__weak 不会产生强引用。指向的对象释放后,会自动指向nil。不会产生野指针。
__unsafe_unretained 不会产生强引用。但是不会自动指向nil
__weak的原理:需要看runtime的源码里面,dealloc销毁对象的时候是怎么做的。
3. dealloc
当一个对象要释放时,会自动调用dealloc,接下的调用轨迹是
dealloc
_objc_rootDealloc
rootDealloc
object_dispose
objc_destructInstance、free
dealloc里面弱引用指向nil
所以,weak修饰的对象自动指向nil的原理:
1.把弱引用存储到SideTable的weak_table_t这个哈希表里面;
2.对象要dealloc销毁的时候,取出当前对象的弱引用表weak_table_t,把弱引用进行清除,指向当前对象的指针设置为nil
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0