- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我只是在编写一些探索性代码来巩固我对 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;
}
运行代码并调用此方法后,我注意到几件事:
通常,如果我尝试访问在达到零保留计数后应该被释放的内容,我会收到 EXC_BAD_ACCESS 错误。在这里,我得到了一个 malloc“double free”错误。这是为什么?
无论我在代码中添加多少行“[stringPointer release]”,NSLog 都会报告保留计数为 1。当我添加更多版本时,我只会收到更多“double free”错误。为什么发布声明没有按预期工作?
虽然我过度释放了 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/
我是一名优秀的程序员,十分优秀!