0

私は最初のアプリをほぼ完成させました (長い道のりですが楽しい時間です)

アプリのメモリ使用量を減らすために1週間試していますが、それがうまくいかない場合は、使用後にビューの割り当てを解除したいのですが、それが起こらないことがわかります...

searchviewController にメモリの問題はありませんが、100 MB の RAM を使用する DetailsViewController の方が多くなっています。

私のアプリがどのように構築されているかを要約して示します。

Searchview controller 

The main screen --> UIViewController with tableview 

in the didSelectRowAtIndex i have:

    DetailsViewController *controller = [[DetailViewsController alloc]initWithNibName:@"DetailsViewController" bundle:nil];

    SearchResult *searchResult = [searchResults objectAtIndex:indexPath.row];
    controller.searchResult = searchResult;


DetailsViewController

詳細画面は、行を選択すると呼び出されます。サブビュー (カスタム スクロールビュー) を持つ UIview カスタム スクロールビューには icarousel (カスタム uiview) があります。

.h

@property (nonatomic,weak) SearchResult *searchResult;

.m

@property (nonatomic, retain) iCarousel *carousel;
@property (nonatomic, retain) UINavigationItem *navItem;

実装:

    MGBox *tablesGrid, *table1;

ViewDidLoad:

//Add barButton
UIBarButtonItem *reactButton = [[UIBarButtonItem alloc]..];
carousel = [[iCarousel alloc] init..];

//Add Tablesgrid
tablesGrid = [MGBox boxWithSize:tablesGridSize];
tablesGrid.contentLayoutMode = MGLayoutGridStyle;
[self.scrollview.boxes addObject:tablesGrid];

//Add Table
table1 = MGBox.box;
[tablesGrid.boxes addObject:table1];

この後、searchResult をラベルに追加して icarousel (最大 6 項目) を埋める関数があります。icarousel は、scrollview などにサブビューとして追加した uiview です。

navigationBar を押し戻してメイン ビュー コントローラに戻ると、ビューの割り当てが解除されません。なぜですか? (dealloc をログに記録しましたが、呼び出されることはありません)。メモリ警告の後、ViewDidUnload を呼び出し、一部のメモリを解放しますが、まだ解放されません....

私は右の他のオブジェクトへの参照を持っていませんか? searchResult を除いて、私はそれを弱いものに設定したので、参照するべきではありませんか?

いくつかの情報:

メインビューで検索した後、私は持っています:

ライブ バイト: 5,75 mb リビング: 27.342 トランジストリ: 68.200 全体のバイト: 25.30 mb

行を選択して detailsViewController に入ると、次のようになります。

ライブ バイト: 5.4 MB リビング: 32.498 トランジストリ: 76.488 バイト全体: 29.55 MB

icarousel のサブビュー行をドラッグした後 (写真を見て):

ライブ バイト: 5.5 mb リビング: 32.798 トランジストリ: 122.850 全体のバイト: 36.41 MB

カスタム テーブル ビューでいくつかのテーブルを選択した後

ライブ バイト: 5.7 MB リビング: 33.508 トランジストリ: 161.80 バイト全体: 40.12 MB

アプリでリンクを開いて戻った後 (モーダル ビューで開き、もう一度閉じます)

ライブ バイト: 6.7 MB リビング: 43.821 トランジストリ: 371.761 バイト全体: 144.95 MB

写真をクリックして写真を全画面表示にし、再び詳細画面に戻った後 (モーダルを開いて閉じる)

ライブ バイト: 6.76 MB リビング: 43.798 トランジストリ: 400.850 バイト全体: 155.69 MB

そして、私が別の行に戻った場合、それは決して少なくならず、追加するだけです

私に厳しくしたり、理由もなくトピックをシャットダウンしたりしないでください..

ヒントやアドバイスをください。または、「問題」が何であるかわからない場合は、これらが何であるかを説明してください: Live Bytes - #living - #Transitory - 全体のバイト - # 全体

そして、このウェブサイトが持つすべての情報に感謝したいと思います。

4

1 に答える 1

2

あなたの質問への答えとして:

  1. ナビゲーション バーで「プッシュ バックするとき」と言いました。あなたが「飛び出した」という意味だったと思います。押すと、セカンダリ コントローラー/シーンに移動します。あなたは戻ってポップします。popViewControllerAnimatedを参照してください。同様に、毎回presentViewController、 が関連付けられている必要がありますdismissViewControllerAnimated

  2. ストーリーボードを使用する場合は、ストーリーボードに循環セグエがないことを確認してください (たとえば、A から B へのセグエと、B から A への別のセグエ)。このトピックに関する簡単な説明については、iOS 5.1 の ARC およびストーリーボードで解放されないメモリを参照してください。

  3. もう 1 つの可能性は、「強い参照サイクル」(別名「保持サイクル」) です。『 Advanced Memory Management Programming Guide』を参照してください。コントローラーへの強い参照を維持している可能性のあるものはすべて、この問題を引き起こす可能性があります。あまり目立たない例として、NSTimerオブジェクトの繰り返しなどがあります。


アップデート:

メモリ管理に関するゼネラルカウンセル

  • メモリに問題がある場合は、常に静的アナライザーを使用してコードを実行する必要があります。これは、ARC を使用しない場合、または Core Foundation 呼び出しを使用する場合に特に重要ですが、通常、メモリの問題が発生した場合の最初のステップとして適切です。

  • Instrumentsを使用してアプリ内のリークを見つける方法のガイダンスについては、Instruments を使用したリークの検索を参照してください。

  • メモリ割り当てにスパイクが発生した場合、スパイクの原因を特定すると役立つ場合があります。割り当てから、それらの割り当てのソースのより意味のある分析に移行する方法についての具体的なアドバイスについては、このStack Overflow answerのポイント #4 を参照してください。要するに、割り当てで説明のつかないジャンプの 1 つを強調表示し、一番下のウィンドウをコール ツリーを表示するように設定し、システム ライブラリを非表示にして、どのルーチンでメモリが消費されているかを確認します。

于 2013-01-10T15:33:22.567 に答える