NSAutoreleasePool 实现原理

概述 html

autorelease 是NSObject的一个类方法,它是经过调用[NSAutoreleasePool addObject:self] 来把一个对象添加到自动释放池中的,由于这是一个类方法,因此有必要知道是对哪一个对象进行autorelease调用。 数组

NSAutoreleasePool 实例是保存在每个线程的stack中。当一个新pool建立,它就会进栈。当一个stack被销毁的时候,它就出栈。 使用NSAutoreleasePool类方法时,须要从当前线程中获取stack最上面的pool对象,来获取当前pool。 并发

当找到正确的pool后,调用addObject: 实例方法来将对象添加到pool中。当对象被添加到pool中,其实他是添加到pool中的一个可变数组中去。 ui

当pool被销毁时,pool会遍历可变数组中的全部对象,并发送 release 方法给每个对象。还有一点额外说明,若是一个pool被销毁,而且这个pool不是stack最上端的,这个pool还会销毁该pool之上的全部pool。 spa

总结 线程

  • 没有方法知道一个对象是否已经被自动释放了。
  • 若是对象被autorelease 两次,这个对象就会被两次添加到pool中,当pool被销毁,该对象就会被release两次。
  • 自动释放池的对象是当当前自动释放池被释放时被释放。pool是当它的代码显性的销毁它时而被销毁。
  • 若是在一个线程上autorelease一个对象,并将它传给另外一个线程,不会有特殊处理。当第一个线程池被销毁的时候,该对象也会被release, 无论该对象在新线程发生了什么。若是你须要继续保留这个对象,就须要在传递以前retain这个对象。

原文连接:http://www.mikeash.com/pyblog/friday-qa-2911-09-02-lets-build-nsautoreleasepool.html htm

相关文章
相关标签/搜索