我只是寫一些探索性的代碼來鞏固我的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