iphone内存管理奇怪的问题

abh*_*jit 4 iphone objective-c nszombie

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

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

[myFoo release] ;
[myFoo printMessage] ;
Run Code Online (Sandbox Code Playgroud)

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

关心阿比吉特

Jos*_*phH 7

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

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

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

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

更新

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

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

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

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