2

请帮助我,我做错了什么。

我使用BubbleCelland BubbleElementfrom the examples。由于未知原因,应用程序有时会在本机代码中崩溃。如果我不使用,我会尝试一点点来纠正这种情况DequeueReusableCell,并且总是创建一个新的BubbleCell. BubbleElement此外,如果构造函数传递一个字符串常量作为标题,而不是对象字段,问题就会消失。

堆栈跟踪: http ://pastebin.com/KAYzpHDk


问题比看起来更深。您的建议没有帮助,应用程序仍然崩溃。

我做了一个单独的项目,只留下了显示问题所需的最少代码。这个问题在某种程度上与 System.Json 相关......也许。

这是该项目的存档: https ://dl.dropbox.com/u/63074515/BubbleNativeCrash.zip

动作顺序: 1) 打开项目 2) 编译并运行模拟器,无需调试(配置Debug|iPhoneSimulator) 3) 在第一个视图中单击 horse1 4) 在出现的列表中,上下滚动整个项目几次5)在我的情况下,在这个阶段我们崩溃了......(堆栈跟踪: http: //pastebin.com/KAYzpHDk

如果不是立即失败,可以返回联系人列表,反之亦然,甚至一次几次。失败的速度取决于聊天中的消息数量。

现在有趣的部分。如果在 ChatViewController.cs 中注释第 406 行并取消注释第 407 行,问题将完全消失(或者我无法在合理的时间内重复它):

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

也就是说,将一个常量字符串传递给 BubbleElement 构造函数。在那之后,我认为问题不会重复。

我试图让一切保持原样,但使用 Json 删除工作 - 问题消失了。仅当 BubbleElement 从 JsonValue 读取字符串(第 36 行的 IM\IMMessage.cs)时才会出现问题。即使在 IMMessage.cs 中有为 MessageText 设置一个常量字符串 - 问题也消失了。

我究竟做错了什么?:)

ps对不起我的英语......它由谷歌翻译提供支持。

4

1 回答 1

1

您不会保留GetCell. 因此,一旦方法返回, GC 可以(并且将)收集托管实例,而本实例将继续存在(因为它在 iOS 内部被引用)。

这在您使用时效果很好,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消息(例如来自数组)会导致相同的崩溃。这有点奇怪,我会进一步研究这个......

最后更新

事实证明,调用CreateResizableImage可能会遇到 iOS错误。解决方法是使用较旧的StretchableImageAPI。该问题已(重新)提交给 Apple。

于 2012-07-17T18:34:31.103 回答