2

請幫助我,我做錯了什麼。使用UITableView在本地代碼中單擊隨機崩潰

我從示例中使用BubbleCellBubbleElement。 由於原因不明,該應用程序有時會以本機代碼的形式崩潰。 如果我不使用DequeueReusableCell,我會嘗試一些方法來糾正這種情況,並且始終創建一個新的BubbleCell。 此外,如果構造函數BubbleElement傳遞字符串常量作爲標題,而不是對象字段,則問題消失。

堆棧跟蹤:http://pastebin.com/KAYzpHDk


的問題是更深比看起來。 你的建議沒有幫助,應用程序仍然崩潰。

我做了一個單獨的項目,只留下了顯示問題所需的最少代碼。 這個問題與System.Json有關......或許。

下面是該項目的檔案: https://dl.dropbox.com/u/63074515/BubbleNativeCrash.zip

的動作序列: 1)打開項目 2)編譯並沒有調試(配置調試運行模擬器|)iPhoneSimulator) 3單擊horse1在出現的列表中的第一個視圖 4),滾動整個項目幾次上下 5)在我的情況下,在這個階段,我們崩潰...(堆棧跟蹤:http://pastebin.com/KAYzpHDk

如果不立即失效,您可以返回到聯繫人l ist,反之亦然,甚至幾次。 失敗的速度取決於聊天消息的數量。

現在有趣的部分。 問題完全消失(或者我不能重複它在一個合理的時間),如果在評論ChatViewController.cs線406和取消註釋行407:

// string messageText = msg.MessageText ?? string.Empty; 
string messageText = "Hello, World!!!"; 

也就是說,使傳遞到BubbleElement構造一個常量字符串。 之後,我想這個問題不會重複。

我試圖離開一切,但刪除與Json的工作 - 問題消失。 只有當BubbleElement從JsonValue(IM \ IMMessage.cs在第36行)讀取一個字符串時纔會出現問題。 即使在IMMessage.cs中爲MessageText設置了一個常量字符串,問題也會消失。

我在做什麼錯? :)

p.s.對不起,我的英語......它由谷歌翻譯。

回答

1

您不保留任何參考管理您從GetCell返回的實例。因此,一旦該方法返回而實例將繼續存在(因爲它在iOS內引用),則GC可以(並將)收集實例。

當您使用UITableViewCell,因爲所有的狀態保持在本地實例內也能正常工作。但是,如果您從中繼承並添加自己的託管的字段,則情況並非如此。在這種情況下,您將無法訪問託管狀態,因爲它不會存在(您將擁有的實例不會是您創建的實例)。

解決此問題的簡單方法是保留對您創建的BubbleCell的引用,例如,在列表中,所以GC不會收集它們。

static List<BubbleCell> cell_cache = new List<BubbleCell>(); 

    public override UITableViewCell GetCell(UITableView tableView) 
    { 
     var cell = tableView.DequeueReusableCell(isLeft ? BubbleCell.KeyLeft : BubbleCell.KeyRight) as BubbleCell; 
     if (cell == null) { 
      cell = new BubbleCell(isLeft); 
      cells_cache.Add (cell); 
     } 
     cell.Update(Caption); 
     return cell; 
    } 

不要忘記清除列表再一次不需要的細胞(例如關閉UITableView時候)。

更新來自附加信息

cell_cache必須static,否則將不利於(我的錯誤,上面固定),以保持引用活着。但是,正如你發現的那樣,這不是解決這個問題的方法(源代碼顯示單元格可以被重用)。

OTOH該問題與使用JSON無關。使用相同的string消息(例如來自陣列)會導致相同的崩潰。這是一個有點怪異,我會這樣進一步investgate ...

最後更新

原來以CreateResizableImage調用可以打在iOS bug。解決方法是使用舊的StretchableImage API。該問題已(重新)提交給Apple。

+0

謝謝......我真的很期待結果。我試圖使用靜態_cellCache,沒有區別。 – xpg934 2012-07-18 14:38:15

+0

原始的BubbleCell示例具有相同的問題(使用相同字符串的子集)。 Bug填入@ https://bugzilla.xamarin.com/show_bug.cgi?id=6177 – poupou 2012-07-18 14:43:17