autoreleasepool分析
main函数是整个程序的入口,从我们一进入main 函数就会接触到autoreleasepool。
int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
整个iOS应用都是包含在一个自动释放池block中。
使用
clang -rewrite-objc
对main.m编译之后我们会发现autoreleasepool@{}被转换成为一个__AtAutoreleasePool结构体struct __AtAutoreleasePool { __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();} ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);} void * atautoreleasepoolobj; };
实际上,我们的main函数在工作时是这样的
int main(int argc, const char * argv[]) { { void * atautoreleasepoolobj = objc_autoreleasePoolPush(); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); objc_autoreleasePoolPop(atautoreleasepoolobj); } return 0; }
autoreleasepool的实际是调用objc_autoreleasePoolPush和objc_autoreleasePoolPop方法