AutoReleasePool

2018-06-04  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读