Board logo

标题: 内存管理(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