iOSアプリの開発がある程度進んだ段階で Received memory warning の警告が出力されるものの、とりあえず動くからいいや、と見て見ぬふりをする開発者も多いのではないでしょうか。私もその中の一人でした(笑)
たとえアプリが正常に動作しているように見えても、気持ちのいいものではないですし、放置できる問題ではありませんので解決策をメモします。
INDEX
Received memory warningが出た時の対処方法
ここではARCを使用し開発を行っていることを前提に話を進めます。比較的解決しやすいと思われる順に解説します。
- デバイスを再起動させてみる
- そもそも開発しているアプリの問題ではなく、他のアプリのメモリリークの影響により警告が出ているであればこれで解決するはず。
- UIScrollViewでページングしている場合
- 見えていないページは removeFromSuperView を行っているか確認する。
- CGImageRef,CGImageContext を使用している場合
- ARCを使用していてもこれらは明示的に開放する必要がある。
- [code]CGImageRelease(img);
CGContextRelease(context);[/code] - UIImage を imageNamed で生成している場合
- imageNamed を使用した記述例(リソースファイルがキャッシュされるため、表示は高速だがメモリを食う)
- [code]
UIImageView *image = [UIImageView imageNamed: @”myImage.png”];
[/code] - imageNamed を使用しない記述例(リソースファイルはキャッシュされないが、表示が遅くなる場合がある)
- [code]
NSString *path= [[NSBundle mainBundle] pathForResource:@”myImage” ofType:@”png”];
UIImage *image= [[UIImage alloc] initWithContentsOfFile:path];
cell.thumb.image = image;
[/code] - UImageView 使用後に nil を代入している場合
- オブジェクトと image プロパティそれぞれに nil を代入する必要がある
- [code]
myImageView = nil;
myImageView.image = nil;
[/code] - その他の対策
- UIView を addSubView した場合も、一時的に表示するようなものであれば不必要になったら removeSubView をする
まとめ
ARCだからメモリ管理はおまかせという姿勢ではなく、言語の特徴やARCの守備範囲をしっかり理解しておく必要があるということでしょうか。
結局、ARCを使用するしないに関わらず、後片付けはきっちり行いましょうということだと思います。
この記事がみなさんのお役に立ちましたら、下記「Share it」よりブックマークやSNSで共有していただければ幸いです。