需要澄清NSAutoreleasePool

jfa*_*jay 3 iphone memory-management autorelease nsautoreleasepool

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

我的问题是;
在主要功能中有一个NSAutoreleasePool.我想知道; 当我们调用autorelease方法时,它在哪里发送对象?我的意思是; 它是NSAutoreleasePool在某个地方发送主要功能(或)的对象?

提前致谢.

Dar*_*ust 8

实际上有一堆自动释放池.每当您这样做时[[NSAutoreleasePool alloc] init],新创建的池将自动置于自动释放池堆栈之上.您可以在需要时创建自己的池.

更确切地说:每个线程上都有一堆自动释放池.因此,每当你创建一个线程(例如with [foo performSelectorInBackground:@selector(bar) withObject:baz])时,你需要做的第一件事是创建一个池或者你的对象泄漏(这会创建臭名昭着的消息,如"NSAutoreleaseNoPool():类NSCFString的对象0xd819d0自动释放,没有池地方 - 只是泄漏",这是一个非常常见的问题在这里SO).

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

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