ios内存管理--知识

作者: zxpzwbs | 来源:发表于2017-09-28 11:36 被阅读51次

    毛奇

    普鲁士的胜利,早在小学教师的讲台上就决定了。

    俾斯麦

    我们德国人,除了上帝谁也不怕,但正是因为对上帝的敬畏,使我们珍爱并维护和平。

    个人github:https://github.com/zxpLearnios?tab=repositories

    1. 怎么使用autorelease pool

    @autoreleasepool{
    // code here
    }
    注意:由于@autoreleasepool同时兼容MRC和ARC编译环境(NSAutoreleasePool只能在MRC下使用)

    2. 什么时候需要自己手动创建autorelease pool?

    1)你写的循环创建了大量临时对象 -> 你需要在循环体内创建一个autorelease pool block并且在每次循环结束之前处理那些autoreleased对象. 在循环中使用autorelease pool block可以降低内存峰值
    2)你创建了一个新线程

    1. 当线程开始执行的时候你必须立马创建一个autorelease pool block, 否则你的应用会造成内存泄露.

    2.1 使用场景 :

    1. 利用@autoreleasepool优化循环,
    2. 如果你的应用程序或者线程是要长期运行的并且有可能产生大量autoreleased对象, 你应该使用autorelease pool blocks
    3. 长期在后台中运行的任务, 方法

    这里介绍一种特殊的情况:

    😯

    先上苹果官方源码

    – (id)findMatchingObject:(id)anObject {
    id match;
    while (match == nil) {
    @autoreleasepool {
     match = [self expensiveSearchForObject:anObject];
      if (match != nil) {
        [match retain]; /Keep match around./
     }
      }
       }
       return [match autorelease]; /Let match go and return it./
    }
    

    在block结束之后, 你要注意的是任何autoreleased对象已经被处理过了(release). 请不要对这个对象发送消息或者把这个对象当做方法的返回值返回. 会引发野指针错误.
    解决方法 : 苹果是这么做的 : 在block内对match对象发送retain消息和在block外对match发送autorelease消息能延长match对象的生命周期并且允许match对象在block外部接收消息或者作为方法的返回值返回. 我们不需要再关心match什么时候释放, 因为它已经交给了上一层的autorelease pool去管理.

    相关文章

      网友评论

        本文标题:ios内存管理--知识

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