簡體   English   中英

iPhone開發人員-viewDidUnload子視圖

[英]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。

  1. 稍后會再次調用-loadView來重新創建視圖嗎?
  2. 我在-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM