autorelease 的实现
调用autorelease 方法速度比较快的原因:
在 NSObject 的 initialize方法中,通过
static IMP autorelease_imp 来对 NSAutoreleasePool 的 @selector(addObject:) 方法进行了缓存,以后调用不需要通过查找,直接通过该方法指针进行调用即可。
实际调用结果等同于
1 | -( id )autorelease{ |
在 NSAutoreleasePool 内部,具体实现为
1 | +(id)addObject:(id)obj{ |
即在pool内部会维护一个数组,每个被添加到pool内部的对象都会添加到数组中去。
当pool被调用到 drain方法时,会将pool内所管理的对象进行一个release操作,然后dealloc销毁自身。
我们可以通过@autoreleasepool{
//code
}
来自己创建并管理一个pool,也可以使用系统维护的autoreleasepool来实现内存的释放。
而由系统来维护的autoreasepool则会在runloop的运行过程中不断的创建与销毁,来实现内部变量的释放