2

私を助けてください、私は何が間違っていますか。

私は例からBubbleCellと を使用します。BubbleElement理由は不明ですが、アプリケーションがネイティブ コードでクラッシュすることがあります。を使用しない場合は状況を少し修正して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私の英語で申し訳ありません... Google翻訳を利用しています。

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 に答える