2011-04-13 123 views
0

我创建我释放一个释放对象后会发生什么?

object *Obj = [[Obj alloc] init]; 

的OBJ保留数为1之后,我放开,对象被释放。

如果我尝试再次释放对象,会发生什么?

+7

代码,编译,请自己看看? – scalbatty 2011-04-13 11:43:42

+0

@luzal:你离rtfm不远......我认为这不是一个好主意。 – 2011-04-13 12:10:26

回答

5

EXT_BAD_ACCESS很可能是因为您的对象引用不再有效。

1

代码可能会崩溃。但是大部分时间它也可能工作。

你制动一个规则,你可能会被抓住。但你也可以放弃它,生活在不断担心的事情中,以后可能会被抓住。

0

获取EXT_BAD_ACCESS。因为你已经释放它,现在试图再次释放。

您的对象引用不再有效。

+3

发送任何消息到一个无对象什么都不做。 – Till 2011-04-13 11:56:22

+2

Oh boy .. Calling [nil release];不会有任何伤害,不需要检查这个。但是,[myObj版本]不会将myObj设置为NULL,因此当您想要确保您无法将版本释放时,您很可能会双倍释放它。 – JustSid 2011-04-13 11:58:05

+0

没有Objective-C中的NullPointerException ... – fabian789 2011-04-13 15:03:40

0

一旦对象的保留计数达到0,它就会被释放,并且所有进一步访问它的尝试都将导致随机行为。

如果使用autorelease来代替,保留计数不会被降低,并且该对象将被放入autoreleasepool中。一旦达到autoreleasepool drain命令,该对象只会降低其保留计数,通常在更广泛的范围内以更高的级别完成。如果您在autoreleasepool耗尽后确实需要该对象,则应在执行drain之前保留该对象,否则它将具有与第一段中完全相同的行为。

1

有在这里做出一个重要的区别:你无法释放对象再次,因为对象不再存在。如果您向变量(即release或任何其他消息)发送另一个消息,则行为未定义,因为该变量不再指向有效的对象。 (可能变量现在指向的地址将被重用于不同的对象,在这种情况下,它可能不会崩溃,但当然这仍然是一个错误。)