因为现在大家都在使用ARC模式下进行编程,一个很重要的问题也是最容易被大家所忽视的问题就是自动释放池,大部分程序员尤其是刚入行的都只是知道有这么一个东西,但具体是什么,工作的原理是什么,在什么时候使用它都一概不知。所以写一篇文章,记录一下个人对自动释放池的一些理解。
我们新建一个OC项目,在main函数中可以看到这么一串代码:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
其中就引用了一个自动释放池。其实,自动释放池@autoreleasepool{}在系统中所编译的代码为:
1.void *ctx = objc_autoreleasepoolPush(); //创建一个无类型指针的哨兵对象
2.执行@autoreleasepool{}中对应{}里所书写的代码
3.执行objc_autoreleasepool(ctx);//释放哨兵对象所分隔区域内所有对象的引用计数
由以上可以看出,autoreleasepool工作的原理就是一个压栈,一个出栈,push方法创建哨兵对象作为标记,pop操作作批量引用计数释放的工作。
介绍完大概代码的原理之后说一下一个比较官方的对于autoreleasePool的总结吧。
autoreleasepool是以栈为节点,通过双向链表的形式组合而成的,autoreleasepool是与线程一一对应的。
那么什么是双向链表呢,双向链表的单位是节点,从