2016 - 2 - 20 ARC知识总结(二 autorelease概念及实现)

时间:2023-03-09 07:17:29
2016 - 2 - 20 ARC知识总结(二 autorelease概念及实现)

首先祝自己生日快乐~23咯~

一  autorelease的概念

autorelease会像C语言的自动变量那样来对待对象实例。当超出作用域(相当于变量作用域)时,对象的实例release实力方法被调用。

另外,同C语言的自动变量不同的是,编程人员可以自己设置变量的作用域,即通过autoreleasepool来实现 。

调用对象的autorelease方法,其实就是将对象就近放入一个NSAutoreleasePool中,该对象的生存周期相当于C语言变量的作用域。对于所有调用了autorelease方法的对象,当自动释放池被销毁时,都将调用release方法。

一个典型的应用就是NSRunloop中。当observe监听到Runloop进入时,会创建自动释放池,当Runloop进入休眠之前会销毁自动释放池并重新创建一个新的自动释放池。在Runloop退出时,也会销毁自动释放池通过这种方法,就可以避免出现内存不足的现象。

另外一个就是在cocoa框架中的很多类方法也会返回autorelease的对象,比如+array。

二 autorelease的实现

通过GNUstep学习:

在调用autorelease方法时,内部其实是调用了当前所使用的autoreleasepool对象的实例方法

[pool addObject:obj];

而该方法是实质就是向内部对象数组中增加一个对象。

[array addObject];

而销毁自动释放池也就是通过forin循环找到每一个数组的objc,并让其调用release方法。