objective-c - 为什么我可以在 [super dealloc] 之后释放 ivar 而不会出现段错误?

标签 objective-c cocoa memory-management dealloc

在 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/

相关文章:

objective-c - 尽管有 ARC,但内存使用量很大

ios - 何时需要将应用程序源包含在测试目标中?

ios - 前向申报摊位应用程序

ios - 如何切换回 View Controller 而不丢失数据

iphone - 选择 UITabBar 时调用方法?

objective-c - 在 Objective C 中使用 nspredicate 时如何解决空间问题?

cocoa - 使用 @avg 集合运算符格式化 NSPredicate 的字符串

objective-c - "unrecognized selector sent to instance"处于 Release模式而非 Debug模式

C++ 3D vector 更新 malloc 不正确的校验和

c - 请求分页上下文中的神秘数字 '63'