2010-11-25 55 views
0

我認爲我有些內存管理失蹤。代碼如下:發佈對象的調用方法

NSString *string = @"foo"; 
[string release]; 
NSLog(@"%@", string); 

我希望得到該代碼的內存錯誤,但代碼運行沒有錯誤。我注意到這一點,因爲我正在關注一本書,並且在設置屬性和添加子視圖(但插入到主視圖中之前)之前發佈了scrollView。

我的問題是,什麼時候對象真的被釋放?這是否考慮了良好的編碼風格?

回答

3

如果你分配,保留或複製一個對象,你有責任釋放它。其他的一切都由系統處理,並且會被自動發佈池刷新。

上有SO已經太多的內存管理的問題,有一個快速環顧四周,讓自己熟悉https://stackoverflow.com/search?q=memory+management+iphone

[編輯] 可能是你需要了解你的問題中最重要的部分是你的倒數第二段:

I was following a book and a scrollView was released before setting properties and adding a subView (but after being inserted in the main view). 

我還沒有看到這個代碼,但它可能是您添加了滾動到你的UIView的實例。在這些情況下,接收視圖始終保留其子視圖,因此您可以自由釋放它。

一旦UIView實例被釋放,它也會發送一個釋放消息給它的所有子視圖,其中包括scrollView。

有意義嗎?

+0

是的,其實我現在明白它是如何在scrollView的上下文中工作的。謝謝。 – 2010-11-25 21:57:20

5

這是可行的,因爲您的string變量指向已編譯到應用程序中的常量字符串。 retain它什麼都不做,release它什麼都不做。它存在於靜態存儲器中,只有當程序從內存中卸載時纔會被銷燬。

3

將消息發送到釋放對象是未定義的行爲。您可能會遇到內存錯誤,您最終可能會向另一個對象發送消息,最終可能會向前一個對象的幻影版本發送消息 - 這一切都取決於實現細節和運行時環境的細節不受你的控制。在這個特定的情況下,你正在運行NSString常量不變的實現細節。

至於具體何時將釋放一個對象,這也是一個實現細節。如果你沒有擁有一個對象,並且沒有合理的保證,它仍然會在周圍(例如你剛剛通過[someArrayYouOwn objectAtIndex:0]得到它),你不應該處理它。

最好的策略是:不要發送消息給你不再擁有的對象。遵循內存管理規則。