[英]iPhone dev - viewDidUnload subviews
我很難理解UIViewController中的幾個方法,但是首先我會說一下我認為它們的含義(忽略接口構建器,因為我沒有使用它):
-init
:初始化在內存不足的情況下不需要釋放的與視圖無關的東西(即不是對象或不能輕易重新創建的對象)。
-loadView
:創建設置[self view]
屬性的[self view]
。
-viewDidLoad
:創建所有其他視圖元素
-viewDidUnload
:釋放在-viewDidLoad
創建的-viewDidLoad
。
didReceiveMemoryWarning
:內存不足的情況下,釋放不必要的東西,例如緩存的數據,如果此視圖沒有[super didReceiveMemoryWarning]
視圖,則[super didReceiveMemoryWarning]
將繼續釋放(卸載)視圖並調用-viewDidUnload
。
-dealloc
:釋放所有內容
-viewWillAppear:
,- -viewDidAppear:
,- -viewWillDisappear:
,- -viewDidDisappear:
言自明,除非您想對這些事件做出響應(否則),否則不需要。
我不確定兩件事。 首先,Apple文檔說,當-viewDidUnload
時,該視圖已被釋放並設置為nil。
-loadView
來重新創建視圖嗎? -viewDidLoad
中創建了一些我沒有-viewDidLoad
做ivar / property的東西,因為沒有必要,它將被視圖保留(因為它們是它的子視圖)。 因此,當視圖被釋放時,它也會釋放視圖,對嗎? 釋放視圖時,它會釋放其所有子視圖嗎? 因為我在-viewDidLoad
中創建的所有對象都是[self view]
子[self view]
。 因此,如果它們已被釋放,為什么在-viewDidUnload
再次釋放它們? 我可以理解使用這些方法加載和卸載視圖時可見的必要數據,但是就像我問的那樣,為什么要釋放子視圖(如果它們已經被釋放)? 編輯 :閱讀其他問題后,我想我可能已經明白了(我的第二個問題)。 在我只使用局部變量的情況下,對其進行分配,使其成為子視圖並釋放,它的保留計數為1(通過將其添加為子視圖),因此在釋放視圖時也是如此。 現在,對於具有ivars指向它們的view元素,我沒有使用屬性,因為沒有外部類需要訪問它們。 但是現在我認為那是錯誤的,因為在這種情況下:
// MyViewController.h
@interface MyViewController : UIViewController {
UILabel *myLabel;
}
// MyViewController.m
. . .
- (void)viewDidLoad {
myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 10)];
[myLabel setText:@"Foobar"];
[[self view] addSubview:myLabel];
}
- (void)viewDidUnload [
// equivalent of [self setMyLabel:nil]; without properties
[myLabel release];
myLabel = nil;
}
在這種情況下,標簽將在-release
后發送-release
消息,因為ivar不會保留它(因為它不是屬性)。 但是對於一個屬性,保留計數將為兩個:保留它的視圖和該屬性。 因此,然后在-viewDidUnload
其釋放。 所以最好總是對這些東西使用屬性,對嗎? 或不?
稍后會再次調用
-loadView
來重新創建視圖嗎?
是的,只要有人訪問view
屬性。
釋放視圖時,它會釋放其所有子視圖嗎?
是。
至於標簽和以后不需要的東西,通常的方法是在將它們附加到視圖之后簡單地釋放它們:
UILabel *foo = [[UILabel alloc] init…];
[self.view addSubview:foo];
[foo release];
在這種情況下,當視圖被釋放時,標簽將被釋放。
您的示例中的內存管理很好。 當你alloc
標簽,其retainCount
啤酒花1,視圖保留它( retainCount
= 2),那么該視圖被釋放,釋放的標簽( rc
= 1),然后你終於自己釋放標簽( rc
= 0,的dealloc )。
為了使事情更加清楚-變量myLabel
不會顯式保留標簽,但是您仍然擁有它,因為已對其進行了分配。 那是可可內存管理的基本規則之一: alloc
+1, retain
+1, release
-1,稍后autorelease
-1。
例:
@property(retain) UILabel *foo;
self.foo = [[UILabel alloc] init…];
這將是泄漏,因為標簽在alloc期間獲得+1,而在為foo
屬性生成的setter中獲得+1。 閱讀《可可記憶管理指南》或Scott Stevenson的Objective-C教程 。 Cocoa中的內存管理非常簡單,經過一番思考,您應該在所有情況下都非常滿意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.