高度なメモリ分析を扱う WWDC 2010 ビデオを見ています (セッション 311 ):
ビデオの 45:00 あたりで、パフォーマンス エンジニアが、アプリが RAM にロードした「Resident Dirty メモリ」をどうするかについて話し合います。エンジニアは、メモリ警告に応答して、アプリがこれをクリアする必要があることを提案しています。エンジニアはカスタム クラスの「フラッシュ」メソッドを貼り付け、didReceiveMemoryWarning
すべて問題ありませんが、コードにはメモリを解放する方法の例が実際には示されていません。
私が持っている質問は、「イメージ IO」で使用されるダーティ メモリの大きなチャンクをフラッシュするにはどうすればよいかということです。:
これは約 74 mb のメモリで、誰かが iOS6 に戻すのを待っています。何も起こっていません。自然に消えないので、iOSに戻す方法を知る必要があります。
これらのブロックは、このようなコードと (おそらく他の画像関連の操作) に由来するように見えます。
UIImage *screenshot = nil;
@autoreleasepool {
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(iPhoneRetinaIconSize, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(iPhoneRetinaIconSize);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
問題は、大量のメモリが RAM にロードされ、アプリがクラッシュするまでオペレーティング システムに戻すことができないことです。
webview 関連のダーティ メモリについては、これでうまくいくことがわかりました。
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
// Dispose of any resources that can be recreated.
}
UIImage、CALayer、または UIGraphics に相当するものはありますか?