1:NSAutoreleasePool实际上是个对象引用计数自动处理器。NSAutoreleasePool可以同时有多个,它的组织是个栈,总是存在一个栈顶pool,也就是当前pool,每创建一个pool,就往栈里压一个,改变当前pool为新建的pool,然后,每次给pool发送drain消息,就弹出栈顶的pool,改当前pool为栈里的下一个
pool。
2:NSAutoReleasePool 和 线程
每个线程都拥有一个栈,这个栈存储的都是pool对象,对NSObject和其子类发送autorelease消息,都会将这个对象放进执行这个消息所在线程的栈顶的pool中,等到[pool release]的时候,对pool中栈数据结构中存储对象按照先进后出的顺序进行遍历,对每个对象发送一条release消息;
控制台确认AutoreleasePoolPage 类的情况如下:
3. 何时创建NSAutoReleasePool
<1>.在自动生成的xcode工程当中,在main方法的开始会创建一个, 然后main结束即主线程 thread退出时释放。
<2>.run loop的每次iteration即迭代 中在每个事件循环(event loop)的开始会创建一个, 在结束时会销毁, 这样就能及时的释放内存,事件循环中包含有触摸,用户输入,网络接收数据包含socket和异步回调NSUrlConnection,定期或时间延迟时间(NSTimer),这样即使没有手动创建,在程序运行的过程中也会时刻在释放内存.
4:如果 是autoreleasePool
NSAutoreleasePool 对象的话会发生异常
异常显示为:
通常在使用Objective-C 也就是Foundation框架时,无论调用哪一个对象的autorelease
实例方法,实际上调用的都是NSobject 类的autorelease 实例方法,但是对NSAutoreleasePool类,autorelease 实例方法已被该类重载,因此运行时就会出错