似乎在Objective-C中,负责内存分配的方法(如C中的malloc())是-[NSObject alloc]。那释放内存呢?是由-[NSObject dealloc]完成的吗?这就是为什么在我们自己的类的dealloc中,我们必须最后调用[super dealloc]而不是首先调用[super dealloc]吗?

我问是因为我不明白为什么,如果我先放置[_bar release],然后在下一行使用[super dealloc]释放对象,我不会遇到分段错误。 _bar运行后,如果释放对象的内存,则应该已经是不属于该进程的内存块。

最佳答案

我想您是说,您有以下代码:

- (void)dealloc
{
    [super dealloc];
    [_bar release]; // _bar is a member variable
}


您期望在第二行出现分段错误,但实际上并非如此。

原因是运气!

操作系统将捕获对您的进程不拥有的内存的访问,但是它无法管理您的进程内发生的所有事情。在这种情况下,您正在访问已标记为空闲的内存,但是它仍然属于您的进程,因此行为是不确定的。内存在几毫秒前是有效的,因此很可能还没有人开始重用此页面,因此它上可能仍然有有效的数据。因此它可能会成功。但是它也可能失败。

这是错误的代码,您不应该发送它。但是仅仅因为它是不正确的和未定义的,并不意味着它就不会工作。

关于objective-c - 为什么在[super dealloc]之后没有segfaulting的情况下释放ivar?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12374836/

10-12 13:37