美文网首页iOS 开发 Objective-C
第七篇:Objective-C 知识回顾内存管理之二

第七篇:Objective-C 知识回顾内存管理之二

作者: 望穿秋水小作坊 | 来源:发表于2019-11-14 17:26 被阅读0次

    7.1.自动释放池

    问题一:思考如下代码,array是什么时候被释放的?
    - (void)viewDidLoad {
        [super viewDidLoad];
        //1.思考如下代码,array是什么时候被释放的?
        NSMutableArray *array = [[NSMutableArray alloc] init];
        NSLog(@"%@", array);
    }
    
    • 在当次 runloop 将要结束的时候调用 AutoreleasePoolPage::pop(),会给 array 对象发送一个 release 的信号,从而释放掉。
    问题二:AutoreleasePool 的实现原理是怎么样的?
    问题三:AutoreleasePool 为何可以嵌套使用呢?
    • 多层嵌套调用就是多次插入哨兵对象。
    问题四:AutoreleasePool 的使用场景或者说什么时候需要手动创建?
    • 在 for 循环中 alloc 图片数据等内存消耗较大的场景,手动插入 autoreleasePool,每一次 for 循环都对内存进行一次释放,来降低内存的使用峰值。防止一些内存消耗过大从而导致的一些问题。
    autoreleasePool 自动释放池的两个基本概念 双向链表的结构图 栈结构的复习 AutoreleasePoolPage 的结构 AutoreleasePoolPage::push方法调用过程 autorealse 的系统内部流程 AutoreleasePoolPage::pop 大致流程

    7.2.循环引用

    问题一:思考循环引用有哪几种?
    • 自循环引用
    • 相互相互引用
    • 多循环引用
    问题二:思考如何破除循环引用?
    • 避免产生循环引用
    • 在合适的时机手动断环
    问题三:思考解决循环引用的具体方案有哪些?
    • __weak (在使用 delegate 和 block 的时候经常使用到)
    • __block (一般用在 block 方面产生的循环引用问题)
    • __unsafe__unretained (由这个关键字修饰的对象,不会增加引用计数)
    问题四:思考__block 会在 MRC 和 ARC 下的表现?
    • MRC 下,__block 修饰对象不会增加其引用计数,避免了循环引用
    • ARC 下,__block 修饰对象会被强引用,无法避免循环引用,需手动解环
    问题四:思考 __unsafe__unretained 的使用注意事项?
    • 修饰对象不会增加其引用计数,避免了循环引用。
    • 如果被修饰对象在某一时机被释放,会产生悬垂指针。
    思考图中循环引用的点,需要都能有具体代码场景出来
    问题五:思考在日常的开发工作中,你是否遇到了循环引用,你是怎么解决的?
    NSTimer 破除循环引用的办法,必须要口述出来

    相关文章

      网友评论

        本文标题:第七篇:Objective-C 知识回顾内存管理之二

        本文链接:https://www.haomeiwen.com/subject/zhyrictx.html