autorelease 的实现

autorelease 的实现

调用autorelease 方法速度比较快的原因:
在 NSObject 的 initialize方法中,通过
static IMP autorelease_imp 来对 NSAutoreleasePool 的 @selector(addObject:) 方法进行了缓存,以后调用不需要通过查找,直接通过该方法指针进行调用即可。

实际调用结果等同于

1
2
3
-( id )autorelease{
[NSAutoreleasePool addObject:self];
}

在 NSAutoreleasePool 内部,具体实现为

1
2
3
4
5
6
7
+(id)addObject:(id)obj{
pool = currentPool();
[pool addObject:obj];
}
- (void) addObject: (id)anObj{
[autorelease_array_lisy addObject:anobj];
}

即在pool内部会维护一个数组,每个被添加到pool内部的对象都会添加到数组中去。

当pool被调用到 drain方法时,会将pool内所管理的对象进行一个release操作,然后dealloc销毁自身。

我们可以通过@autoreleasepool{
//code
}
来自己创建并管理一个pool,也可以使用系统维护的autoreleasepool来实现内存的释放。

而由系统来维护的autoreasepool则会在runloop的运行过程中不断的创建与销毁,来实现内部变量的释放

http://www.cocoachina.com/ios/20150610/12093.html