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