iPhone/iPadアプリ作成の仕上げ・国際化・デバッグSDKで始めるiPad/iPhoneアプリ開発の勘所(3)(4/4 ページ)

» 2010年08月20日 00時00分 公開
[竹内彰吾株式会社ビーブレイクシステムズ]
前のページへ 1|2|3|4       

Leaksを使って“メモリリーク”を検出する

 iPhone/iPadアプリでは、メモリの確保と解放を明示的に行わなければなりません。ちょっとしたコーディングのミスで、アプリが必要のないメモリを確保し続けた状態になり、メモリを圧迫してしまうことがあります。これを「メモリリーク」といいます。

 メモリリークが発生すると、アプリが異常終了したり、iPhone自体にも負荷が掛かってしまいます。これを避けるため、Xcodeにはアプリでメモリリークが発生していないかをチェックする「Leaks」というツールが付属しています。試しにLeaksを使用してメモリリークを発見してみましょう。

 BMI計算アプリのexecuteResetメソッドに下記のコードを記述し、画面のリセットボタンを押したときにメモリリークが発生するようにしてみます。

// リセットボタンの Touch Down に登録するリセット実行メソッド
- (IBAction)executeReset:(id) sender {
    // わざとリークを起こしてみる
    for (int i = 0; i < 10000; i++) {
        NSMutableArray *array = [[NSMutableArray alloc] init];
        for (int i = 0; i < 10; i++) {
            [array addObject:@"Master Of Leak"];
        }
    }
}

 繰り返し呼ばれるaddObjectでNSMutableArrayオブジェクトにNSStringオブジェクトを追加しています。繰り返し処理が終わった後にNSMutableArrayがreleaseされていないため、メモリが確保されたままです。この状態でリセットボタンを押し続けるとメモリリークが発生するので、以下の手順で原因を突き止めます。

 [実行]→[パフォーマンスツールを使って実行]→[Leaks]をクリックします。

 [Instruments]というツールが起動するため、[Leaks]を選択します。

 この状態でシミュレータのクリアボタンを何度か押すと、「NSCFArray」という行が表示され、[Size]の値が増加していくのが分かります。これにより「NSCFArrayというObjectがメモリを確保し続けている」ということが分かり、メモリリークが発生していると推測できます。

 さらに、ソースコード中のどの場所で起きているかは、画面下部にある【1】のアイコンをクリックすると、【2】のスタックトレースの一覧が表示されます。その中にBMICalcVIewControllerのexecuteResetメソッドが表示されているので、こちらをクリックします。

 選択するとソースコード中のメモリリークが起きている個所が表示されるため、この内容を参考に修正します。

 Leaksを用いたメモリリークの発見方法は、以上です。

次回からは、いよいよiOS 4でアプリ作成

 今回は、iPhoneアプリ制作の仕上げとして、ホームアイコンや起動画像・国際化の設定方法から、今後より複雑なアプリを制作するときのためのデバッグ機能・メモリリーク発見方法について解説しました。

 サンプル完成版のソースコードは、こちらからダウンロードできます

 次回からは、いよいよSDKをiOS 4対応にし、新機能を交えたさまざまな開発テクニックについて紹介していきたいと思います。どうぞお楽しみに。

筆者紹介

株式会社ビーブレイクシステムズ

竹内 彰吾(たけうち しょうご)

どこにでもいる職業プログラマであり、好きな言語はJavaとObjective-C。現在は、業務システムの開発に従事し、顧客の要望に日々全力で応えている。

一方、ほかの案件や趣味ではiPhone/Androidアプリ開発にも積極的に取り組んでいる



前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。