Asial Blog

Recruit! Asialで一緒に働きませんか?

【iOS】MemoryWarningSenderでメモリ警告バグを効率的に見つける

カテゴリ :
バックエンド(プログラミング)
タグ :
Tech
iPhone
iOS
Objective-C
こんにちは。松田です。
iOS用アプリを作成していると、予期しないバグが発生することが多々ありますが、その原因として多いのが「メモリ警告」です。メモリ警告が発生すると、非表示状態のviewが破壊されるため、開発者の意図しない動作を引き起こす事があります。

この状態をテストするには、iOSシミュレータの「メモリ警告をシミュレート」機能を使うことができますが、発生させるタイミングは開発者次第で尚且つショートカットキーも無い(たぶん)ため、なかなか効率的に活用することができません。

これを解決するためのツールがMemoryWarningSenderです。
これを利用すれば、iOSシミュレータの実行中に定期的にメモリ警告を発生させることができるため、想定外のバグの発見につなげることができます。

MemoryWarningSenderは、ブログ「ゆめ技」で、ちきん(@mokemokechicken)さんが作成し公開しています。
http://yumewaza.yumemi.co.jp/2012/03/memorywarningsender_in_ios_simulatorios.html
この記事を読めば使い方はわかりますが、こっちにも簡単に記述しておきます。


インストール



SIMBLのインストール


iOSシミュレータを機能拡張するために、SIMBLが必要になります。
http://www.culater.net/software/SIMBL/SIMBL.php
上記URLからSIMBL-{バージョン番号}.zipをダウンロードし、解凍後にSIMBL-{バージョン番号}.pkgをインストールします。

MemoryWarningSenderのインストール


https://github.com/mokemokechicken/MemoryWarningSender
上記URLでgithub登録されています。
「ZIP」リンクからダウンロードし、解凍するとMemoryWarningSender.pkgが入っているので実行してインストールします。


使い方



iOSシミュレータを起動してメニューの「ハードウェア」を開くと、「メモリ警告を繰り返し送る」が追加されています。


5秒毎、15秒毎、60秒毎の選択肢があるので、どれか一つを選択します。

あとはこの状態でアプリをぐりぐり実行させるだけです。
定期的にメモリ警告が発生するので、想定外のバグが発見できるかもしれません。
是非お試しください!



メモリ警告関連バグの対処法



備忘録も兼ねて・・・

ViewControllerからViewを生成する場合、大まかに以下のような流れになります。
  1. 1. ViewControllerの初期化メソッド(initなんちゃらメソッド)の実行
  2. 2. ViewControllerのloadViewの実行
  3. 3. ViewControllerのviewDidLoadの呼び出し

しかし、メモリ警告でviewが破壊されると、1の初期化メソッドが呼び出されず2と3だけが実行されることになります。そのため、初期化メソッド内でviewの操作を行っているとメモリ警告後におかしな動きになってしまうことになります。

これを踏まえて、

  • ViewControllerの初期化メソッドでviewの操作をしないこと
  • viewの操作をしたい場合はviewDidLoadで行うこと

この2点を守りながらコーディングすればメモリ警告によるバグはだいぶ防げるはずです。