一、autoreleasepool源码解释
AutoreleasePool是一个堆栈,里面装着指针。那么栈的底层实现是什么呢?是数组。
AutoreleasePool全名叫NSAutoreleasePool。它就是一个对象引用计数自动处理器,在官方文档中被称为是一个类。
在ARC中,在遵守一些规则的情况下,可以自动释放对象。系统自动帮对象调用了autorelease方法,然后就会把对象扔进池里面,等一次runloop结束,这个池会被系统销毁,池里面的对象也就跟着被销毁了。
NSAutoreleasePool可以同时有多个,它的组织是个栈,总是存在一个栈顶pool,也就是当前pool,每创建一个pool,就往栈里压一个,改变当前pool为新建的pool,然后,每次给pool发送drain消息,就弹出栈顶的pool,改当前pool为栈里的下一个 pool。
跟MRC的release方法比较就是延迟了对象的销毁的时间。但autoreleasepool依然不是.Net/Java那种全自动的垃圾回收机制。
二、@autoreleasepool{} C++文件
@autoreleasepool
到底是什么?我们在命令行中使用 clang -rewrite-objc main.m
让编译器重新改写这个文件。
如果报错'UIKit/UIKit.h' file not found ,解决方法如下:
1.进入终端,键入命令 vim ~/.bash_profile
2.在vim界面输入i进入编辑编辑状态并且键入:alias rewriteoc='clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk'
3.键入完毕,点esc退出编辑状态,再键入:wq退出vim并保存