iphone内存管理奇怪的问题

时间:2010-09-27 12:10:10

标签: iphone objective-c nszombie

这是我用xcode编写的一段代码

Foo * myFoo = [[Foo alloc] init] ;

[myFoo release] ;
[myFoo printMessage] ;

如果我是对的,那么当调用printmessage函数时它应该给出运行时错误,因为myFoo在那时被释放了。但是在xcode中,代码正在运行并且打印消息被调用,是否因为设置xcode而出现问题?

此致 作者Abhijit

2 个答案:

答案 0 :(得分:7)

您通过访问释放的内存来调用未定义的行为。

它可能会崩溃,它可能会正常工作,它可能会导致从你鼻子喷出的独角兽跳舞。

要在开发代码时检测内存错误,您应启用NSZombie,请参阅此处的说明:

http://www.cocoadev.com/index.pl?NSZombieEnabled

<强>更新

您可能想知道它为什么会这样运行 - 当您尝试访问无效的内存时,操作系统应该总是抛出错误?

您不总是得到错误(以及为什么行为未定义)的原因是在每次访问时检查内存是否有效会导致性能下降 - 即。代码会运行得更慢,只是为了检查一些不应该发生的事情。

因此,您必须小心在开发期间捕获所有这些错误,以便它们永远不会发生在最终用户身上。 NSZombies是找到它们的最佳工具。

另一点 - 如果你在xcode中进行“构建和分析”,它也可能在构建时发现错误。当然,静态分析器会在构建时检测到一些内存错误。

答案 1 :(得分:0)

释放一个对象不是即时的,该对象将被释放,但是当一个人发送一个释放消息时,不能确定它是什么。您正在经历的行为是正常的。