2011-08-05 48 views
0

我有這個在我的tableView:cellForRowAtIndexPath:奇怪跳到另一個return語句

if (condition) { 
    // make a custom cell 
    return cell; // line number 240 
} 
else { 
    // make another kind of cell 
    return cell; // line number 256 
} 

我得到一個EXC_BAD_ACCESS,所以我啓動了調試器,設置斷點,通過行的代碼行步進。

當我從行號256 前進「跨越」時,它直接行240,即進入if語句的另一個分支。這怎麼可能?

非常感謝您的幫助,
薩沙

+0

什麼版本的XCode和你使用的編譯器? – Codo

+0

XCode 4.0.2,編譯器LLVM GCC 4.2。 – Mundi

+0

試試GCC 4.2是否也會發生同樣的情況。我對LLVM有一些不好的經驗,至少在發佈模式下。 – Codo

回答

2

我想我找到了解決方案。帶有表格視圖的視圖控制器也是後臺網頁加載線程的委託人。顯然,調試器一次只能通過一個線程。代表例程確實調用scrollToRowAtIndexPath:,但未檢查上述condition

不過,我發現調試器的行爲有點令人費解。

0

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath將調用x次,其中x =行數。

所以我認爲你的問題是你的(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section沒有返回一個正確的值,並且很可能是一個大於你從中提取數據的值。

即如果您有一個大小爲3的數組,但嘗試製作第4行單元格。

+0

感謝您的回答。 'numberOfRowsInSection:'是正確的。另外,調試器在下一步**時跳轉到另一行**,而不是下一次調用該函數。 – Mundi

0

該方法調用自身的次數與每次單元爲零時numberOfRowsInSection方法和中返回的行數相同。最有可能的是,控制權轉到下一行爲其分配UITableViewCell,並且在那個時候,我猜測if條件得到了滿足。

+0

感謝您的回答。我查了一下,情況仍然不滿意。此外,該函數似乎不會再被調用。行號240沒有斷點。 **調試器**的指針在下一步跳轉到240。這真讓我感到困惑。 – Mundi

+0

如果你使用了'Loops'(for,while等)或'Recursion'(cellForRowAtIndexPath),那麼控制的唯一方法就是上升。你應該檢查控制流併發布NSLogs :)這可以讓我們理解並幫助你解決邏輯問題。 – Legolas

+0

謝謝,我知道。但是調試器的「step over」功能是做什麼的?它應該進入**下一行**執行。即使在循環的情況下,它仍然是**,並且步入if語句的**不同分支**是不可想象的。 – Mundi

0

Step Over與Step Into相同,只是當它到達另一個過程的調用時,它將不會進入該過程。該過程將運行,並且您將被帶到當前過程中的下一個語句。

如此一步得到下一個語句和您的cellForRowAtIndexPath調用numberOfRow次。所以在一些迭代中,如果條件變爲真,並且進入你的線沒有240

+0

這沒有意義。如果該函數確實被再次調用,則「跳過」應該到達該函數的開始處(即,「if」語句),而不是第240行。 – Mundi