美文网首页
AutoReleasePool

AutoReleasePool

作者: 烟雨平生花飞舞 | 来源:发表于2018-06-04 16:34 被阅读0次

    1.什么是@autoreleasepool? 

    2.里面对象的内存什么时候释放? 

    3.什么时候要用@autoreleasepool?

    回答: 

    1.@autoreleasepool是自动释放池,让我们更自由的管理内存

    2.当我们手动创建了一个@autoreleasepool,里面创建了很多临时变量,当@autoreleasepool结束时,里面的内存就会回收

    3.ARC时代,系统自动管理自己的autoreleasepool,runloop就是iOS中的消息循环机制,当一个runloop结束时系统才会一次性清理掉被autorelease处理过的对象,其实本质上说是在本次runloop迭代结束时清理掉被本次迭代期间被放到autorelease pool中的对象的。至于何时runloop结束并没有固定的duration。 

    方便是方便了,但是有些情况下,我们还是需要手动创建自动释放池,那么,什么时候呢?

    如果你正在编写不基于UI 框架的程序,比如命令行工具。

    如果你编写的循环创建了很多临时对象。 

    你可以在循环中使用自动释放池block,在下次迭代前处理这些对象。在循环中使用自动释放池block,有助于减少应用程序的内存占用。

    你生成了一个辅助线程。 

    一旦线程开始执行你必须自己创建自动释放池。否则,应用将泄漏对象。

    记住:NSAutoreleasePool里面的维护了一个NSMutableArray数组,所有标记为autorelease的对象都会被添加都该数组中。只有当pool对象被drain的时候,才会去遍历该数组,若retainCount为0则释放内存,不为零就发生内存泄露!OC已经为我们建立一个pool对象,但是该pool对象需要比较久的时间才能drain掉,因此在一些遍历处理的场景中,需要我们手动去建立pool对象,并手动drain掉。

    AutoReleasePool 原理

    原理:

    Autorelease Pool全名叫做NSAutoreleasePool,是OC中的一个类。autorelease pool并不是天生就有的,你需要手动的去创建它。一般地,在新建一个iphone项目的时候,xcode会自动地为你创建一个Autorelease Pool,这个pool就写在Main函数里面。在NSAutoreleasePool中包含了一个可变数组,用来存储被声明为autorelease的对象。当NSAutoreleasePool自身被销毁的时候,它会遍历这个数组,release数组中的每一个成员(注意,这里只是release,并没有直接销毁对象)。若成员的retain count 大于1,那么对象没有被销毁,造成内存泄露。默认的NSAutoreleasePool 只有一个,你可以在你的程序中创建NSAutoreleasePool,被标记为autorelease的对象会跟最近的NSAutoreleasePool匹配。可以嵌套使用NSAutoreleasePool。

    缺点:

    即使NSAutoreleasePool看起来没有手动release那么繁琐,但是使用NSAutoreleasePool来管理内存的方法还是不推荐的。因为在一个NSAutoreleasePool里面,如果有大量对象被标记为autorelease,在程序运行的时候,内存会剧增,直到NSAutoreleasePool被销毁的时候才会释放。如果其中的对象足够的多,在运行过程中你可能会收到系统的低内存警告,或者直接crash。

    扩展:

    如果你极具好奇心,把Main函数中的NSAutoreleasePool代码删除掉,然后再自己的代码中把对象声明为autorelease,你会发现系统并不会给你发出错误信息或者警告。用内存检测工具去检测内存的话,你可能会惊奇的发现你的对象仍然被销毁了。其实在新生成一个Run Loop的时候,系统会自动的创建一个NSAutoreleasePool,该NSAutoreleasePool无法被删除。

    实例:

    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

    ClassA *a=[[[ClassA alloc] init] autorelease];

    ClassB *b=[[[ClassB alloc] init] autorelease];

    ClassC *c=[[[ClassC alloc] init] autorelease];

    [pool release];

    1、AutoreleasePool底层详解

    https://www.jianshu.com/p/677687ffff73

    https://my.oschina.net/taptale/blog/91894

    https://www.cnblogs.com/wengzilin/p/4351187.html

    https://blog.csdn.net/lizitao/article/details/56485100

    https://www.jianshu.com/p/32265cbb2a26

    https://www.jianshu.com/p/f87f40592023

    https://www.cnblogs.com/sleblogs/p/5528701.html

    https://cloud.tencent.com/developer/article/1006618?fromSource=gwzcw.700857.700857.700857

    相关文章

      网友评论

          本文标题:AutoReleasePool

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