3.autorelease
2019-01-25 本文已影响1人
你weixiao的时候很美
1.简介:
autoRelease是苹果进行内存管理的另一个方式。 他的作用是 对加入autoReleasePool中的对象在autoreleasePool进行pop动作的时候调用release。
2.使用方法
使用方法:
- 生成并持有NSAutoReleasePool 对象。
- 调用已分配对象的autorelease方法。
- 废弃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操作。