我只是写一些探索性的代码来巩固我的Objective-C的理解和我碰到这个例子中,我没有完全得到来了。我定义这个方法并运行代码:代码示例:为什么我仍然可以访问这个对象NSString的我已经发布了它?
- (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;
}
运行的代码,调用此方法后,我注意到一些事情:
通常情况下,如果我尝试访问东西是后理应dealloced打零保留计数,我得到一个EXC_BAD_ACCESS错误。在这里,我得到一个malloc“double free”错误。这是为什么?
无论我在代码中添加多少行“[stringPointer release]”,NSLog都会报告保留计数为1.当我添加更多版本时,我只会得到更多的“双倍释放”错误。为什么发布声明不按预期工作?
虽然我已经过度释放stringPointer,但我收到了一堆“双免费”错误,返回值仍然工作,如果没有任何事情发生(我在主代码中有另一个NSLog报告返回值)。该程序继续正常运行。再次,有人可以解释为什么发生这种情况?
这些例子是相当琐碎,但我试图让这是怎么回事十足的把握。谢谢!
阅读答案后,阅读其他网站,并多玩一点,我开始认为NSStrings不像其他对象那样分开。例如,如果我使用UILabels而不是NSStrings执行相同的操作,那么肯定会发生停止该程序的错误。在我看来,不管你是否“分配”一个NSString,在后台它都被视为一个基元而不是一个对象,而alloc/release语法就是为了一致性。 – iPhoneToucher 2009-10-07 19:07:14