3

每当我们调用autorelease方法时,它的对象都会NSAutoreleasePool. 当池被耗尽时,它正在向池中的所有对象发送释放。

我的问题是;
在 main 函数中有一个NSAutoreleasePool. 我想知道;当我们调用该autorelease方法时,它会将对象发送到哪里?我是说; 它正在将NSAutoreleasePool主要功能(或)中的对象发送到某处?

提前致谢。

4

1 回答 1

8

实际上有一堆自动释放池。每当您这样做时[[NSAutoreleasePool alloc] init],新创建的池会自动放在自动释放池堆栈的顶部。您可以在需要时创建自己的池。

更准确地说:每个线程上都有一堆自动释放池。因此,每当您创建一个线程(例如使用[foo performSelectorInBackground:@selector(bar) withObject:baz])时,您需要做的第一件事就是创建一个池,否则您的对象会泄漏(这会创建臭名昭著的消息,例如“NSAutoreleaseNoPool(): Object 0xd819d0 of class NSCFString autoreleased with no pool in地方 - 只是泄漏”,这是 SO 上一个非常常见的问题)。

当您调用 时autorelease,该对象将注册到当前线程的最顶层自动释放池(即:在该线程上最后创建的那个)。主运行循环有自己的自动释放池,在每次运行循环迭代 (AFAIK) 时都会清空。池从main.m那里捕获任何对象,例如,在创建运行循环自动释放池之前,Cocoa Touch 可能在内部生成这些对象。

编辑:有关更多幕后信息,请参阅Mike Ash 的“让我们构建 NSAutoreleasePool”

于 2011-09-02T16:49:00.157 回答