2011-04-19 58 views

回答

0

一旦给定对象autorelease电话,现在你给它的发行责任autorelease pool,现在它就像你没有拥有它。它会显示随机行为,它可能会崩溃或者有时没有。(取决于当autorlease池释放它,如果它的发行那么它就会崩溃)

+0

这并不完全准确。它将保持有效,直到池被耗尽。它不会因为您自动发布而突然开始崩溃。 – Chuck 2011-04-19 15:12:05

+0

是的,那是我在最后一行写的。由于我们不知道在给定的代码周围是什么,我们永远无法确定它(不管他是否已经耗尽了)。 – Ravin 2011-04-20 03:11:05

26

让我们来分析一下:

[Ball alloc]:这将创建一个我们自己的(因而需要释放)一个球对象。

[[Ball alloc] init]:这会初始化我们刚创建的Ball对象。

[[[Ball alloc] init] autorelease]:这会将Ball添加到当前的自动释放池,因此当该池被耗尽时它将被释放。例如,如果我们要从方法返回球,这是正确的。

[[[[Ball alloc] init] autorelease] autorelease]:这会再次释放Ball对象。这是100%错误。 alloc是我们需要平衡的唯一所有权声明,因此球现在将被释放太多次。这可能以任何方式表现出来,但它可能只会崩溃。

+0

我尝试了这个[[[[Ball alloc] init] autorelease] autorelease];它不会崩溃。你能告诉我什么时候会崩溃吗? – 2014-05-21 11:52:04

+0

@SachinKumaram:这是未定义的行为。没有保证。一般来说,随着分配更多的对象,它倾向于更容易崩溃。 – Chuck 2014-05-21 15:16:44

1

简短回答:发生撞车事故。