2014-04-13 91 views
1

試圖理解目標C中的內存管理。任何幫助將不勝感激。NSString內存生命週期

NSString * myString;

上面的代碼是不是將內存分配給myString?如果是的話多少字節? 如果myString聲明將內存分配給myString對象,那麼編譯器或運行時系統將如何知道字符串myString對象將接收多大的字符串。我的意思是字符串可以是任意長度的。那麼應該分配多少內存?

myString =[NSString stringWithFormat:@"Testing String"]; 

當對象不再使用時會發生什麼情況?在應用程序運行之前,內存會被釋放還是會被myString的內容佔用?

+1

您可能想嘗試找到一本關於面向對象編程的優秀教科書,並研究* object *和* pointer *之間*非常重要的區別。許多想成爲程序員的人是這個主題的創始人。 (你真的不應該嘗試Objective-C編程,除非你清楚地瞭解它們之間的區別。) –

回答

4

NSString *myString;不分配字符串。相反,它保留足夠的字節來將指針保存爲字符串;該指針的生命週期取決於代碼行放置的位置(並且不可控制)。

myString =[NSString stringWithFormat:@"Testing String"];執行分配*,並且字符串大小足夠容納從您的格式產生的字符串;在這種情況下足夠用於「測試字符串」字符。

myString指針超出範圍,並假設沒有出現過的字符串,的任何其他副本,如果你正在使用ARC,該字符串將被釋放。如果你沒有使用ARC,你有責任在你完成它的時候釋放它。

分配: 一般來說,一個Objective C分佈看起來就像pointer = [Class alloc];並在實踐中它更可能看起來像pointer = [[Class alloc] init];(或任何類的其他init*方法)。方法[NSString stringWithFormat:(NSString *), ...]是一種方便(或者完全或者本質上)[[NSString alloc] initWithFormat:(NSString *), ...]

+2

應該注意的是,經典的新手錯誤是做類似'NSString * myString = [[NSString alloc] init]; myString = someOtherString;',認爲你需要「分配」字符串(指針),然後才能給它分配任何東西。最多alloc/init是浪費的動作;在最壞的情況下(沒有ARC),它可能會造成嚴重的存儲泄漏。 –