以下代码执行时会发生什么? Ball * ball = [[[ball alloc] init] autorelease] autorelease];

时间:2011-04-19 03:42:58

标签: iphone objective-c

执行以下代码时会发生什么?

Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];

3 个答案:

答案 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何时释放它,如果它被释放然后它会崩溃)