执行以下代码时会发生什么?
Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
答案 0 :(得分:27)
让我们分解一下:
[Ball alloc]
:这会创建一个我们拥有的Ball对象(因此需要释放)。
[[Ball alloc] init]
:这会初始化我们刚创建的Ball对象。
[[[Ball alloc] init] autorelease]
:这会将Ball添加到当前的自动释放池中,因此当该池耗尽时它将被释放。例如,如果我们要从方法中返回Ball,这是正确的做法。
[[[[Ball alloc] init] autorelease] autorelease]
:这会再次自动释放Ball对象。这是100%的错误。 alloc
是我们需要平衡的唯一所有权声明,因此Ball现在将被释放太多次。这可能以多种方式表现出来,但它可能会崩溃。
答案 1 :(得分:1)
简短回答:随后发生了崩溃。
答案 2 :(得分:0)
一旦你给对象autorelease
打电话,现在你已经将它的释放责任交给了autorelease pool
,现在就像你没有拥有它一样..它会显示它可能崩溃的随机行为或有时候没有。(取决于autorlease pool何时释放它,如果它被释放然后它会崩溃)