gpt4 book ai didi

objective-c - 代码示例 : Why can I still access this NSString object after I've released it?

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:57 25 4
gpt4 key购买 nike

我只是在编写一些探索性代码来巩固我对 Objective-C 的理解,我遇到了这个我不太明白的例子。我定义了这个方法并运行代码:

- (NSString *)stringMethod
{
NSString *stringPointer = [[NSString alloc] initWithFormat:@"string inside stringPointer"];
[stringPointer release];
[stringPointer release];
NSLog(@"retain count of stringPointer is %i", [stringPointer retainCount]);
return stringPointer;
}

运行代码并调用此方法后,我注意到几件事:

  1. 通常,如果我尝试访问在达到零保留计数后应该被释放的内容,我会收到 EXC_BAD_ACCESS 错误。在这里,我得到了一个 malloc“double free”错误。这是为什么?

  2. 无论我在代码中添加多少行“[stringPointer release]”,NSLog 都会报告保留计数为 1。当我添加更多版本时,我只会收到更多“double free”错误。为什么发布声明没有按预期工作?

  3. 虽然我过度释放了 stringPointer 并且我收到了一堆“double free”错误,但返回值仍然有效,就好像什么都没发生一样(我在主代码中有另一个 NSLog 报告返回值(value))。程序继续正常运行。同样,有人可以解释为什么会这样吗?

这些示例相当琐碎,但我正在努力全面了解正在发生的事情。谢谢!

最佳答案

您收到双重释放错误,因为您释放了两次并导致了两条 dealloc 消息。 =P

请记住,仅仅因为您释放并不意味着其内存地址处的数据会立即被销毁。它只是被标记为未使用,所以内核知道,在未来的某个时候,它可以免费用于另一 block 数据。在那之前(这在您的应用程序空间中是完全不确定的),数据将保留在那里。

再说一次:释放(和解除分配)不需要立即在字节级别上销毁数据。它只是内核的一个标记。

关于objective-c - 代码示例 : Why can I still access this NSString object after I've released it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1529081/

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