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