我認爲我有些內存管理失蹤。代碼如下:發佈對象的調用方法
NSString *string = @"foo";
[string release];
NSLog(@"%@", string);
我希望得到該代碼的內存錯誤,但代碼運行沒有錯誤。我注意到這一點,因爲我正在關注一本書,並且在設置屬性和添加子視圖(但插入到主視圖中之前)之前發佈了scrollView。
我的問題是,什麼時候對象真的被釋放?這是否考慮了良好的編碼風格?
我認爲我有些內存管理失蹤。代碼如下:發佈對象的調用方法
NSString *string = @"foo";
[string release];
NSLog(@"%@", string);
我希望得到該代碼的內存錯誤,但代碼運行沒有錯誤。我注意到這一點,因爲我正在關注一本書,並且在設置屬性和添加子視圖(但插入到主視圖中之前)之前發佈了scrollView。
我的問題是,什麼時候對象真的被釋放?這是否考慮了良好的編碼風格?
如果你分配,保留或複製一個對象,你有責任釋放它。其他的一切都由系統處理,並且會被自動發佈池刷新。
上有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。
有意義嗎?
這是可行的,因爲您的string
變量指向已編譯到應用程序中的常量字符串。 retain
它什麼都不做,release
它什麼都不做。它存在於靜態存儲器中,只有當程序從內存中卸載時纔會被銷燬。
將消息發送到釋放對象是未定義的行爲。您可能會遇到內存錯誤,您最終可能會向另一個對象發送消息,最終可能會向前一個對象的幻影版本發送消息 - 這一切都取決於實現細節和運行時環境的細節不受你的控制。在這個特定的情況下,你正在運行NSString常量不變的實現細節。
至於具體何時將釋放一個對象,這也是一個實現細節。如果你沒有擁有一個對象,並且沒有合理的保證,它仍然會在周圍(例如你剛剛通過[someArrayYouOwn objectAtIndex:0]
得到它),你不應該處理它。
最好的策略是:不要發送消息給你不再擁有的對象。遵循內存管理規則。
是的,其實我現在明白它是如何在scrollView的上下文中工作的。謝謝。 – 2010-11-25 21:57:20