我只是在编写一些探索性代码来巩固我对 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“双重释放”错误。这是为什么?
无论我在代码中添加多少行“[stringPointer release]”,NSLog 都会报告保留计数为 1。当我添加更多版本时,我只会得到更多“双重释放”错误。为什么发布声明没有按预期工作?
尽管我过度释放了 stringPointer 并且收到了一堆“双重释放”错误,但返回值仍然像什么都没发生一样工作(我在主代码中有另一个 NSLog 报告返回值)。程序继续正常运行。再次,有人可以解释为什么会发生这种情况吗?
这些例子是相当微不足道的,但我试图完全掌握正在发生的事情。谢谢!