繁体   English   中英

释放释放对象后会发生什么?

[英]What happens after I release a deallocated object?

我建立

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

对象保留计数为1。释放它后,对象将被释放。

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

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

代码可能会崩溃。 但这在大多数时候都可以正常工作。

违反规则可能会被抓。 但是您可能同样会摆脱它,一直生活在担心自己以后会被抓住的恐惧中。

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

获取EXT_BAD_ACCESS。 由于您已经发布了它,现在尝试再次发布。

您的对象引用不再有效。

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

如果改用自动释放,则保留计数不会降低,并且该对象将放入自动释放池。 对象只有在到达自动释放池排出命令时才会降低其保留计数,通常在更大范围内以更高的级别执行该操作。 如果排空autoreleasepool后确实需要该对象,则应在执行排水之前将其保留,否则它将具有与我的第一段完全相同的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM