3

APIから取得した写真を表示するためのアプリを作成しています。各写真のサイズは約1MBです。ユーザーが実際にアプリを使用するように、写真を表示してから次の写真に移動する「スライドショー」を設定しました。InstrumentsのiPad1でテストしています。

アプリがメモリ不足の警告を受け取ると、現在ユーザーに表示されていないすべての写真と、APIから返されたすべてのキャッシュされたモデルデータをダンプします。Instrumentsでの割り当てが大幅に減少し、仮想メモリの使用も同様に減少しています。この消費メモリの減少にもかかわらず、私のアプリはまだOSによって強制終了されています。

アプリケーションは、終了する前にクラッシュすることなく、2〜3のメモリ警告に応答します。

最近ARCに切り替えたのですが、何かわからないことがあるのでしょうか?参照をnilに設定するだけで十分だと思います。画像データをダンプするインメモリモデルのコードは次のとおりです。

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
    NSLog(@"Received memory warning; clear image for photo named \"%@\"", _name);
        _image = nil;
        _imageThumbnail = nil;
}];

どちらが呼ばれています。また、メモリ不足の警告を受け取ったときにremoveAllObjectsを呼び出しているNSMutableDictionaryがあります。デバイスコンソールに次のメッセージが表示されます。

Oct  5 19:43:46 unknown configd[25] <Notice>: jetsam: kernel termination snapshot being created
Oct  5 19:43:46 unknown com.apple.launchd[1] <Notice>: (com.apple.accessoryd) Exited: Killed: 9
Oct  5 19:43:46 unknown com.apple.launchd[1] <Notice>: (com.apple.locationd) Exited: Killed: 9
Oct  5 19:43:46 unknown com.apple.launchd[1] <Notice>: (com.apple.mediaserverd) Exited: Killed: 9
Oct  5 19:43:46 unknown com.apple.launchd[1] <Notice>: (UIKitApplication:com.500px[0xd492]) Exited: Killed: 9
Oct  5 19:43:47 unknown kernel[0] <Debug>: launchd[1996] Builtin profile: accessoryd (sandbox)
Oct  5 19:43:47 unknown ReportCrash[1999] <Error>: libMobileGestalt loadBasebandMobileEquipmentInfo: CommCenter error: 1:45
Oct  5 19:43:47 unknown ReportCrash[1999] <Error>: libMobileGestalt copyInternationalMobileEquipmentIdentity: Could not get mobile equipment info dictionary
Oct  5 19:43:47 unknown ReportCrash[1999] <Error>: Saved crashreport to /Library/Logs/CrashReporter/LowMemory-2011-10-05-194347.plist using uid: 0 gid: 0, synthetic_euid: 0 egid: 0
Oct  5 19:43:47 unknown DTMobileIS[1655] <Warning>: _memoryNotification : <NSThread: 0x1cd31410>{name = (null), num = 1}
Oct  5 19:43:47 unknown DTMobileIS[1655] <Warning>: _memoryNotification : {
        OSMemoryNotificationLevel = 0;
        timestamp = "2011-10-05 23:43:47 +0000";
    }
Oct  5 19:43:47 unknown DTMobileIS[1655] <Warning>: _memoryNotification : <NSThread: 0x1cd31410>{name = (null), num = 1}
Oct  5 19:43:47 unknown DTMobileIS[1655] <Warning>: _memoryNotification : {
        OSMemoryNotificationLevel = 0;
        timestamp = "2011-10-05 23:43:47 +0000";
    }
Oct  5 19:43:48 unknown com.apple.locationd[1997] <Notice>: locationd was started after an unclean shutdown
Oct  5 19:43:49 unknown SpringBoard[29] <Warning>: Application '500px' exited abnormally with signal 9: Killed: 9

これは、クラッシュするまでの私の割り当て/VMインストゥルメントです。

メモリを解放しているのに、なぜ私のアプリが強制終了されるのか、誰かが知っていますか?

4

2 に答える 2

3
    _image = nil;
    _imageThumbnail = nil;

nilこれは、実際のオブジェクトを解放するのではなく、ポインタをに設定するだけです。オブジェクトを解放すると、割り当てが解除されます(保持カウントが0に達した場合)。

ARCを使用しているので、プロパティをnilに設定するだけです。

于 2011-10-06T02:59:05.157 に答える
1

私はどこか別の場所でモデルクラスへの参照にぶら下がっていたことがわかりました-メモリ警告中に画像データを解放したとしても、それらは割り当て解除されていませんでした。最終的にはそれらの数が多すぎて、アプリがクラッシュしました。

于 2011-10-06T17:00:19.877 に答える