3.autorelease

2019-01-25  本文已影响1人  你weixiao的时候很美

参考文档:
文章一
文章二

1.简介:

autoRelease是苹果进行内存管理的另一个方式。 他的作用是 对加入autoReleasePool中的对象在autoreleasePool进行pop动作的时候调用release。

2.使用方法

使用方法:

  1. 生成并持有NSAutoReleasePool 对象。
  2. 调用已分配对象的autorelease方法。
  3. 废弃NSAutoreleasePool对象。
NSAutoReleasePool * pool = [[NSAutoReleasePool alloc] init];
id obj = [[NSObject alloc] init];
[obj autorelease];
[pool drain];

对于所有调用了 autorelease 的对象,在废弃NSAutoreleasePool对象时, 都将调用release方法。

3.autorelease用法一:可以降低内存峰值。

在我们程序的主线程的runloop中,每次event loop 开始前,系统会自动创建一个 autoreleasepool ,并在 event loop 结束时 drain。

当我们使用循环等创建了大量autorelease对象时候,在event loop结束前,autoreleasepool没有被drain,对象大量存在造成内存不足。此时,我们可以在循环内再创建一个pool,让autorelease对象在我们创建的pool被drain时释放,可以减少内存峰值。

for (int I = 0 ; I < 图片数;I++){
NSAutoReleasePool * pool = [[NSAutoReleasePool alloc] init];

//将产生的大量autorelease对象放入我们创建的pool里面,而不是主线程的runloop帮我们创建的pool。

[pool drain]; // 在下一次循环开始时候,pool里的autorelease对象被relase

}
4. autorelease用法二: 延迟对象的释放

比如 使用weak时候,weak对象被放入autoreleasepool中。
使用系统的类方法时候,返回类autorelease的对象。
我们自己的类方法,在返回对象时候,系统自动帮我们加入到pool中。

5. autorelease的实现:

autoreleasepool 是没有单独的内存结构的,它是通过以AutoreleasePoolPage 为结点的双向链表来实现的。

push方法: 插入哨兵。
autorelease操作:将对象插入链表中。
pop操作:从该位置到哨兵位置的对象执行release操作。

上一篇下一篇

猜你喜欢

热点阅读