这是我用 xcode 编写的一段代码
Foo * myFoo = [[Foo alloc] init] ;
[myFoo release] ;
[myFoo printMessage] ;
如果我是对的,它应该在调用 printmessage 函数时给出运行时错误,因为此时 myFoo 被释放。但是在 xcode 中,代码正在运行并且打印消息被调用,这是由于 xcode 上的设置而导致的问题吗?
问候阿比吉特
这是我用 xcode 编写的一段代码
Foo * myFoo = [[Foo alloc] init] ;
[myFoo release] ;
[myFoo printMessage] ;
如果我是对的,它应该在调用 printmessage 函数时给出运行时错误,因为此时 myFoo 被释放。但是在 xcode 中,代码正在运行并且打印消息被调用,这是由于 xcode 上的设置而导致的问题吗?
问候阿比吉特
您通过访问释放的内存来调用未定义的行为。
它可能会崩溃,它可能会正常工作,它可能会导致跳舞的独角兽从你的鼻子喷涌而出。
要在开发代码时检测内存错误,您应该启用 NSZombie,请参阅此处的说明:
http://www.cocoadev.com/index.pl?NSZombieEnabled
更新
您可能想知道为什么它会这样工作——当您尝试访问无效的内存时,操作系统肯定总是会抛出错误吗?
您并不总是收到错误(以及行为未定义的原因)的原因是检查内存在每次访问时是否有效会导致性能损失 - 即。代码会运行得更慢,只是为了检查不应该发生的事情。
因此,您必须在开发过程中小心捕获所有这些错误,以免它们发生在最终用户身上。NSZombies 是寻找它们的最佳工具。
还有一点——如果你在 xcode 中进行“构建和分析”,它也可能在构建时发现这个错误。当然,静态分析器会在构建时检测到一些内存错误。
释放一个对象不是瞬间的,对象会被释放,但不能确定是在何时发送释放消息。您遇到的行为是正常的。