2011-01-24 83 views
2

我知道下面不需要手動釋放(作爲其自動釋放):iOS內存管理:釋放一個字符串還是不?

NSString* str1 = [NSString string]; 

,這將需要手動釋放:

NSString* str2 = [[NSString alloc] init]; 
[string2 release]; 

又是如何的呢?它是自動釋放還是不釋放?

NSString* str3 = @"Example string"; 

最後,看着下面的代碼片段:如果我理解正確的iOS內存管理,然後釋放RootViewController的參考「RVC」將清除對象,因此它不會使用它在其他地方的代碼 - 我不想要那個。但是,那麼我是否應該至少將引用設置爲null?或者我可以將代碼引用保留在代碼中,而不會導致長期的內存泄漏?

- (void)myMethod 
{ 
RootViewController *rvc = (RootViewController *)navigationController.topViewController; 
// using rvc somehow... 
// ...but should I set it to null? 
} 

回答

6

不需要釋放字符串文字 - 它不是自動釋放,但它也不是在該行創建的。字符串文字是一種特殊情況(是Objective-C中唯一的文字對象),他們忽略了釋放它們的任何嘗試。

rvc是一個局部變量,所以一旦MyMethod結束就會變得不可訪問。沒有必要將它設置爲任何東西(並且它將是零,不爲空)。除了獲取topViewController的地址並將其存儲在本地變量中之外,您擁有的任務不會執行任何操作。所以沒有內存管理的效果。

1

@"Example string"是編譯時間常數。內存由編譯器分配。因此,在該行

NSString *str3 = @"Example string"; 

你只是分配給一個常數,如果使用的話,「保留」,「黃金」一個你不應該釋放str3

5

,「新」,「複製」 (RANC),那麼你是對象的所有者並負責內存管理。你沒有使用其中的一個RANC單詞,因此你不需要發佈。請參閱http://www.mobiledev.nl/memory-management-in-ios/以獲取更多解釋。