2010-10-07 144 views
0

我以为当main.m中的autorelease池被耗尽时,将会释放由NSMutableDictionary dictionaryWithCapacity:返回的对象。相反,当我将它分配给-init中的一个实例成员时,我发现该对象只会持续-init调用。生命周期[NSMutableDictionary dictionaryWithCapacity:n]

什么是管理由NSMutableDictionary dictionaryWithCapacity:返回的对象的发布?为了进一步神秘化这里发生了什么,我发现当我将一个由便利构造函数创建的自定义类的对象赋给init中的实例成员时,该实例在(例如)touchBegan中仍然“活着” :...

回答

2

一般来说,像这样的API会返回autorelease个d实例。

这意味着当Autorelease池消失时,对象将被销毁。如果你自己不管理自动释放池,那么当你下一次返回消息队列时(假设你在UI线程上),它应该被破坏。

在内部,操作系统在调用代码的每个事件周围推送并弹出自动释放池。因此,如果您有-touchBegan,在调用-touchBegan之前将推出一个新池,并在-touchBegan返回时立即弹出。

如果这不是你想要的,你必须自己retain

+0

好吧,这对我来说是有意义的,除了我自己的类返回的autorelease对象被返回后,便捷构造函数似乎不会以相同的方式释放。 – james 2010-10-07 23:27:27

+0

@james:你什么时候[autorelease]他们?因为如果你在你的游泳池是堆栈中唯一的游泳池时[自动释放]它们,那么它就会进入游泳池。 ([autorelease]所做的就是将该项目添加到当前堆栈池的事物列表中,以便在清除时排除) – 2010-10-07 23:30:40

+1

@james:如果您想知道为什么您的方法以某种方式行事,我们需要看看它们的使用方法和可能的背景。 – Chuck 2010-10-07 23:49:24