2011-01-07 55 views
0

我有一個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變量不是在其他地方使用,而是在所描述的這些方法中使用,並且我可以讀入的所有內容都表明它是正確的方式。

+0

這是實際的代碼還是最小的樣本?因爲你在init和dealloc方法中如果((self = [super init]))和[super dealloc]調用丟失... – 2011-01-07 14:40:56

+0

可能是因爲errorView本身沒有問題。難道是你釋放了兩次「UITableViewController」(或者超過了你的預期)?這會導致`dealloc`方法被調用一個無效的`UITableViewController`對象,該對象可能在`errorView`變量上有垃圾。 – filipe 2011-01-07 14:40:57

+0

這是一個很好的簡化版本,是的,原來確實有提到的例程。當視圖控制器彈出時,UITableViewController會自動釋放。 (並且在創建並推入父視圖控制器之後) – 2011-01-07 14:49:41

回答

3

作爲一個興趣點;發送消息給一個無對象不是一個錯誤;大量的支票完全無用。

如果沒有更多的信息,這裏的確切情況很難指出;如果dataFailedToLoad 實際上是分配errorView的唯一地方,那麼您的代碼應該可以工作。然而,這是失敗表明別的東西正在搞砸你的狗。

順便說一句,一個空指針,即!= nil不是空指針。

1

僅僅因爲你叫init視圖不必被初始化。您應該使用標準方法viewDidLoad以確保視圖不是零。

0

您確定您正在與您認爲正在與之交談的實例進行交談嗎?

我見過不少SO問題,這些問題已經歸結爲接口文件(xib)實例化的加載和開發人員需要實例化的內容之間的混淆。

I.e.在所有方法中執行類似NSLog(@"%@ %p", self, self);的操作,並確保地址 - 實例 - 相同。