簡體   English   中英

使用loadView時無限循環

[英]Infinite loop when using loadView

在UIViewController中使用loadView時非常有趣的問題。

通常我們這樣使用

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    NSLog(@"loadview");
    [super loadView];
}

如果刪除

 [super loadView];

我們將得到這個死循環

- (void)loadView {
    NSLog(@"loadview");

}

為什么?

在這種情況下,只有一種方法可以實現無限循環 - 獲取視圖屬性直到未設置。 如果你寫下(例如):

- (void)loadView {
   self.view = [[UIView alloc] initWithFrame:self.view.bounds];
}

你會得到無限循環,但是

- (void)loadView {
   self.view = [[UIView alloc] initWithFrame:CGRectZero];
}

工作正常。

因此,在未設置視圖屬性之前,您無法訪問它。

既然你只是在超類(UIViewController)中實現了什么,如果你不調用超級方法,那么就不需要完成需要完成的實現。

幾乎所有的超級方法都做了一些關鍵的事情,繼承超類實現的本地類必須一起覆蓋它們(除非你通過引用文檔知道關於super做什么的一切,這從來都不是一個好主意),或者只是添加本地類實現到繼承的超類實現。

總之,無論何時繼承一個類,在大多數情況下都是軟件開發,你應該讓超類執行它的實現,除非可以安全地覆蓋它們。

如果我是正確的,似乎super loadView實現了一些非常關鍵的東西來避免循環。

附加說明:但是,根據文檔,您不應該調用超級方法: http//developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html可能原因是無限循環是由於沒有適當地實現view屬性引起的。

如果覆蓋loadView,則應為控制器的視圖層次結構提供根視圖。 如果你不提供它,每次引用視圖時都會調用loadView,這可能會導致無限循環。 來自文檔:

如果手動指定視圖,則必須實現loadView方法並使用它將根視圖對象分配給view屬性。

導致無限循環的實現:

- (void)loadView {
    NSLog(@"loadview");
}

...在loadView之后,self.view為零

- (void)loadView {
   self.view; // Or anything that references self.view
}

...引用self.view會導致調用loadView,因此是一個無限循環。

正確:

- (void)loadView {
    self.view = [[UIView alloc] init];
    if (self.view == nil) {
        [super loadView]; // Try to load from NIB and fail properly, also avoiding inf. loop.
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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