1

iPhone でアプリをプロファイリングしています。私はLOTを作成し、UIWebViewそれらをMonoTouch.Dialogテーブル(1000としましょう)に貼り付けています。テーブル セクションをクリアし、Web ビューと任意の Web ビューへの参照を破棄するボタンがあります。

UIWebviewMono Profile を使用すると、 のインスタンスが(当然のことながら) ゼロになることに気付きました。ただし、Instruments (Allocations) を使用して同じテストを行うと、「ライブ」Webview の数が減少せず、メモリが回復しないことがわかります。GC.Collect も試してみましたが、違いはありませんでした。

また、Mono プロファイルでは、使用されている RAM の合計が約 1.5 メガバイトであると示されていますが、Instruments では約 5 メガグラムと表示されています。

最初の項目は、その記憶を回復してそれらすべてのインスタンスを破壊することができないように思われるため、より懸念されます。私はこれを間違って読んでいますか、それとも他の問題がありますか? ありがとう。

4

2 に答える 2

4

UIWebView インスタンスの数が Mono プロファイラーで減少し、Instruments では減少しない場合は、ネイティブ コードがそれらのインスタンスへの参照を保持しており、それらが解放されていないことを意味します。

Allocations インストゥルメントで「Record reference count」オプションを有効にし、UIWebView インスタンスが Instruments にしか表示されない場合は、retainCount を調査することをお勧めします。各保持コールとリリース コールをペアにする必要があります (ただし、少なくとも 1 つのペアリングできません。それがあなたが探しているものです)。この時点で、retain 呼び出しに対応する release 呼び出しがない理由を理解する必要があります。

Mono プロファイルも Allocations インストルメントも、実際に使用されている RAM の総量を教えてくれません (そして、それらは異なるものを測定するため、数値が異なるのです)。Mono プロファイラーはマネージド オブジェクトのみを測定しますが、Allocations オブジェクトはマネージド オブジェクトに加えてほとんどの (すべてではない) ネイティブ割り当てを測定します。

于 2013-01-29T12:39:59.180 に答える
1

誤解だと思います。

  • MonoTouch.Dialogはに基づいていUITableViewます。複雑さの多くを隠すことができますが、基本的な動作は同じです。

  • UITableViewインスタンスを使用しUITableViewCellます。ただし、メモリ要件を最小限に抑えるために、可能な限りセルを再利用します。したがって、1000個のセルがあり、画面に1ダースしか表示されないテーブルでは、1ダースのセル(1000個ではない)を割り当てるだけで済みます。

通常の(またはMT.D)コードは次のようになります。

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
    var cell = tableView.DequeueReusableCell ("cell") as MyCell;
    if (cell == null) {
        // create new cell
        cell = new MyCell ();
    } else {
        // prepare cell for reuse
    }
    // customize cell
    return cell;
}

起こりそうなことは次のとおりです。

  • 1000個の要素を作成します。

  • 要素が新しいセルを作成するように求められると、画面全体に約14回表示され、それらを再利用します(たとえば、スクロールした場合)。

  • section.ClearUIをクリアします(UITableViewセルキャッシュではありません)。

  • InstrumentsはUITableView、割り当てられたものを表示します(たとえば、14個のキャッシュ/再利用可能なセル)。

  • UITableViewこれらのセルは、によって割り当てられたを破棄すると解放されますDialogViewController。それ以外の場合、(キャッシュされた)セルは制御できません。

于 2013-01-29T19:59:25.180 に答える