发布解除分配的对象后会发生什么?

时间:2011-04-13 11:40:53

标签: iphone objective-c cocoa

我创建了

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

Obj保留计数为1.释放后,对象被解除分配。

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

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

代码可能会崩溃。但它大部分时间都可以正常工作。

你制定规则,你可能会被抓住。但你也可以侥幸逃脱它,生活在不断的恐惧中,以后你可能会被抓住。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

获取EXT_BAD_ACCESS。因为你已经发布了它,现在又试着再次发布。

您的对象引用不再有效。

答案 4 :(得分:0)

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

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