在 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] 之后释放 ivar 而不会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12374836/