http://blog.csdn.net/ryantang03/article/details/7941058#replyhtml
上面那篇文章是我查找的ios實現下拉刷新功能,在我下載完代碼運行的過程當中發現會報下面的這個錯誤。通過半下午的研究我終於找到了緣由。ios
EGOTableViewPullRefreshTest[2150:907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UITableViewController loadView] loaded the "MainViewController" nib but didn't get a UITableView.'app
1.我找到的第一個解決辦法就是在該網站下的一個評論:http://t6883.codeinpro.us/q/50810b8b4f1eba38a4f10fe6函數
If you subclass a UITableViewController on purpose, you need to change it's default view load behaviour just by overriding it's load view method:網站
- (void)loadView { [super loadView]; }
加到代碼中果真能夠了,因爲不知道緣由,又查找了一下loadView的做用,現附文章以下:spa
http://www.dreamingwish.com/dream-2011/correct-online-information-error-loadview-viewdidload-viewdidunload.html.net
永遠不要主動調用這個函數。view controller會在view的property被請求而且當前view值爲nil時調用這個函數。若是你手動建立view,你應該重載這個函數。若是你用IB建立view並初始化view controller,那就意味着你使用initWithNibName:bundle:方法,這時,你不該該重載loadView函數。代理
這個方法的默認實現是這樣:先尋找有關可用的nib文件的信息,根據這個信息來加載nib文件,若是沒有有關nib文件的信息,默認實現會建立一個空白的UIView對象,而後讓這個對象成爲controller的主view。code
因此,重載這個函數時,你也應該這麼作。並把子類的view賦給view屬性(property)(你create的view必須是惟一的實例,而且不被其餘任何controller共享),並且你重載的這個函數不該該調用super。orm
若是你要進行進一步初始化你的views,你應該在viewDidLoad函數中去作。在iOS 3.0以及更高版本中,你應該重載viewDidUnload函數來釋聽任何對view的引用或者它裏面的內容(子view等等)。
這個網上的資料都說的很不全面,尤爲是藍色字部分。
這個函數在controller加載了相關的views後被調用,而不論這些views存儲在nib文件裏仍是在loadView函數中生成。而多數狀況下是作nib文件的後續工做。
網上資料對這個函數的描述則徹底不對。
這個函數是viewDidLoad的對立函數。在程序內存欠缺時,這個函數被controller調用()。因爲controller一般保存着與view(這裏黑體的view指controller的view屬性)相關的對象(通常是view的子view)或者其餘運行時建立的對象的引用,因此你必須使用這個函數來放棄這些對象的全部權以便內存回收。但不要釋放那些難以重建的數據(不要在這個函數中釋放view)。
一般controller會保存nib文件創建的views的引用,可是也可能會保存着loadView函數建立的對象的引用。最完美的方法是使用合成器方法:
1 |
|
這樣合成器會release這個view,若是你沒有使用property,那麼你得本身顯式釋放這個view。
網上對這個函數的描述含含糊糊,看了等於沒看。
另外:若是controller存儲了其餘object和view的引用,你還得在dealloc方法中釋放這些內存。對於iOS2.x,你還必須在調用super dealloc方法前將這些引用置爲nil。
因此流程應該是這樣:
(loadView/nib文件)來加載view到內存 ——>viewDidLoad函數進一步初始化這些view ——>內存不足時,調用viewDidUnload函數釋放views
—->當須要使用view時有回到第一步
如此循環
2.後來我又無心中看到我我前幾天寫的下面這篇文章是,帶顏色的部分是我着重標出的(前幾天剛寫,裏面的重要問題就忘記了,看來非得被問題拌一腳才能長記性😄)
http://www.cnblogs.com/baozou/p/3314578.html
UITableViewController繼承自UIViewController,可是initWithNibName:bundle:方法的行爲是不同的。普通的UIViewController若是nibName參數是nil,則自動載入和本身類名相同的xib文件。而UITableViewController遇到nibName爲nil時,卻不加載xib文件,而是建立一個空的table view。因此,對於UITableViewController來講,若是使用了xib文件,則必須寫出完整xib文件名,才能正確建立。
所以,當使用了xib時,UITableViewController不能使用這樣的方式建立:
[[TableViewController alloc] init]; [[TableViewController alloc] initWithNibName:nil bundle:nil];
而後我在appdelegate裏面果真找到這樣的代碼:
MainViewController *mainView = [[MainViewControlleralloc] init];看來果然是這個緣由。
3.還有一種方法
下拉刷新的那個例子是定義的類直接繼承自UITableViewController 而 我之前遇到的狀況都是繼承自UIViewController 而後在類中定義一個UITableView。
其實要理解這幾個類之間的關係就好辦了,我就是不明白這幾個類之間的關係纔出錯。
UITableViewDelegate
UITableViewDataSource這兩個代理是在UITableView中定義的,而後放到了UITableView類中來使用,UITableViewController類包含UITableView類變量。