线程与runloop之间的关系:每一个线程,包括主线程,都会拥有一个专属的 NSRunLoop 对象,并且会在有需要的时候自动创建
每当一个app启动时会创建一个默认线程(即主线程),主线程的runloop会自动注册两个observe观察者
第一个observe会观察enter事件,当有enter事件时(即进入runloop),会调用_objc_autoreleasePoolPush()创建自动释放池
第二个observe会观察 两个事件,BeforeWaiting(准备进入睡眠) 和 Exit(即将退出Loop),Exit(即将退出Loop) 时调用 _objc_autoreleasePoolPop() 来释放自动释放池
autoreleasePool以栈的形式进行存储,每当创建一个新的autoreleasePool时,他会压栈在最顶层,当他释放掉以后下边的autoreleasePool会到栈的最顶层
autoreleasePool的工作原理
当一个对象被创建时他的引用计数默认加1,当他被retain一次是应用计数会+1,release一次是引用计数会-1,当这个对象的引用计数为0的时候会被加入到autoreleasePool,并且会执行一次retain操作,在autoleasePool释放时,会对加入他的对象进行一次release跟着autoleasePool一起被释放掉