每当我们调用autorelease
方法时,其对象将转到NSAutoreleasePool
。当池耗尽时,它会向池中的所有对象发送释放。
我的问题是;
在main函数中有一个NSAutoreleasePool
。我想知道;当我们调用autorelease
方法时,它在哪里发送对象?我的意思是;它是将对象发送到主要功能(或)的NSAutoreleasePool
吗?
提前致谢。
答案 0 :(得分:8)
实际上有一堆自动释放池。每当您执行[[NSAutoreleasePool alloc] init]
时,新创建的池将自动置于自动释放池堆栈之上。您可以随时创建自己的池。
更确切地说:每个线程上有一堆自动释放池 。因此,无论何时创建线程(例如使用[foo performSelectorInBackground:@selector(bar) withObject:baz]
),您需要做的第一件事就是创建一个池,否则您的对象会泄漏(这会创建臭名昭着的消息,如“NSAutoreleaseNoPool():Object 0xd819d0类NSCFString自动释放没有池 - 只是泄漏“并且是very frequently asked question here on SO。”
当您调用autorelease
时,该对象将注册到当前线程的最顶层自动释放池(即:该线程上最后创建的那个)。主运行循环有自己的自动释放池,在每次运行循环迭代(AFAIK)时清空。来自main.m
的池用于捕获任何对象,例如可能由Cocoa Touch在创建运行循环自动释放池之前内部生成。
修改:有关更多幕后信息,请参阅Mike Ash's "Let's Build NSAutoreleasePool"