gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:24:19 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com