0

MapViewとUIImagePickerを使用してアプリを作成しています。画面に地図を表示し、ユーザーが進むにつれてその表示ルートを表示しています。ユーザーはその間に画像をキャプチャできます。そのための画面が2つあります。

  1. 地図を表示しています
  2. 画像のキャプチャ(これは画面1からプッシュされます)

画面1から画面2に移動すると、ImagePickerが表示され、ユーザーが画像をキャプチャできるようになります。画面1に戻るとrelease、すべてのオブジェクトが作成されnilます。このタスクは通常で行われましviewDidUnloadたが、メモリの問題が発生していたため、ViewControllerがポップしたときに実行しました。したがって、すべてのオブジェクトは、使い終わるとすぐに解放され、ゼロになります。

地図からログイン画面に移動すると、次のようなことをすべて実行しています。

  1. スーパービューからビューを削除する
  2. すべての関連オブジェクトまたは保持されたオブジェクトを解放します(NSStringオブジェクトも含む)
  3. nilそれらすべてのオブジェクトに値を設定します。

プロファイリングでアプリを実行し、実行時のリークが発生しない場合でも、Activity Monitorでも、アプリの実際のメモリは増え続けます:(

10〜12枚の画像がキャプチャされた後Received memory warning. Level=1、UIImageオブジェクトをメモリに保存していません。私はこれをドキュメントディレクトリに書き込み、文字列パスのみを保存しています。

私を助けて、この問題を解決するために他に何ができるかを教えてください。

アップデート

私が使用している戻るボタンでオブジェクトを解放している間:

- (void)releaseObjects {

    [mapViewNewTour setDelegate:nil];
    [mapViewNewTour removeFromSuperView];
    [mapViewNewTour release];
    mapViewNewTour = nil;
    [lblNavTitle release];
    lblNavTitle = nil;
    [btnEdit release];
    btnEdit = nil;
    [txtTourName release];
    txtTourName = nil;
    [vwTourName release];
    vwTourName = nil;
    [mutDictOfflineSharing release];
    mutDictOfflineSharing = nil;
    [mutArrImage release];
    mutArrImage = nil;

    [_routeLine release];
    _routeLine = nil;
    [_routeLineView release];
    _routeLineView = nil;
    [aLazyLoader release];
}
4

2 に答える 2

3

ARCは4.3でもサポートされているので、それを使用してください。

専用の「releaseEverything」メソッドを使用したアプローチは完全に破られています。所有権の追跡が不足していることを示しており、せいぜいハックです。

viewDidUnloadとにかく非推奨になり、iOS 6のシステムによって呼び出されなくなりました(これに対してビルドする必要があります)。

フレームワークと戦わないでください-それを「正しい」方法で行ってください。

于 2012-10-26T09:46:03.290 に答える
0

機器を実行して、メモリが使用されている場所を確認することをお勧めします。メモリ使用量分析用の特定の機器があります。必要な機器は、アクティビティモニターとVMトラッカーです。

また、メモリ警告が発生するため、NSZombieEnabledで実行していないことを再確認することをお勧めします(スキームで確認してください)。

于 2012-10-26T10:34:01.543 に答える