我有一個UITableViewController,它有一個名爲errorView的UIView *,用於在表視圖上覆蓋錯誤消息,如果一個方法無法加載Web數據。奇怪!=無檢查問題
在init方法中,errorView設置爲nil(在調試器中爲0x0)。
在一個load方法中,在init的末尾調用AND如果點擊一個'refresh'UIButton(在errorView上),errorView與nil比較,並從superview中移除,如果不是nil,在調試器中爲0x0)。
在dealloc方法中,同樣的檢查在釋放之前完成;但由於某些原因,即使該變量未被分配(調試器中爲0xc000),該變量永遠不會爲零,因爲數據失敗的方法從未被調用過。該應用程序然後崩潰,因爲它試圖釋放一個空指針,即!= nil。
例子:
-(id)init {
errorView = nil;
[self Load];
}
-(void)Load {
if(errorView != nil) {
[errorView removeFromSuperView];
[errorView release];
errorView = nil;
}
//Attempt to load data from web
}
-(void)dataFailedToLoad (e.g. UIWebView didFailLoadWithError) {
errorView = [[UIView alloc] initWithFrame, etc];
[self.tableView addSubview:errorView];
}
-(void)dealloc {
if(errorView != nil)
[errorView release]; //Always crashes because errorView is never nil even though it has been assigned nil?
}
我揪頭髮出過這一點。 errorView變量不是在其他地方使用,而是在所描述的這些方法中使用,並且我可以讀入的所有內容都表明它是正確的方式。
這是實際的代碼還是最小的樣本?因爲你在init和dealloc方法中如果((self = [super init]))和[super dealloc]調用丟失... – 2011-01-07 14:40:56
可能是因爲errorView本身沒有問題。難道是你釋放了兩次「UITableViewController」(或者超過了你的預期)?這會導致`dealloc`方法被調用一個無效的`UITableViewController`對象,該對象可能在`errorView`變量上有垃圾。 – filipe 2011-01-07 14:40:57
這是一個很好的簡化版本,是的,原來確實有提到的例程。當視圖控制器彈出時,UITableViewController會自動釋放。 (並且在創建並推入父視圖控制器之後) – 2011-01-07 14:49:41