自分ハックで毎日を楽しく!イリテク!

HOME > iOS プログラミング > iPhoneアプリがメモリリークや不正アクセスで落ちてしまう時の対策
2011/08/22 (2014/08/26更新) タグ: , ,

iPhoneアプリがメモリリークや不正アクセスで落ちてしまう時の対策

このエントリーをはてなブックマークに追加

これまでに作ったアプリが、不定期に落ちたり、落ちなかったりする時があり、ずっと悩んでいたのですが、どうにか解決しました。今のところ、落ちていません。

SPONSOR

落ちるタイミングとして、NavigationControllerを使って移動した直後、しかも画面を読み込み中に戻ったりすると、落ちるパターンが数多くありました。作っているアプリがインターネットから情報を読み込むものが多く、読み込みの途中で前の画面に戻ったりした場合にインスタンスが開放されてしまい、そこへアクセスした為、落ちていたものと思われます。

対策例

例えばこのような場合

@interface test : NSObject
{
 @private
  NSString* teststring;
  id testid;
}

@property (nonatomic, retain) NSString* teststring;
@property (nonatomic, assign) id testid;

@end

以下のようにdeallocでreleaseしていたのですが

- (void)dealloc {
  [teststring release];
  [super dealloc];
}

これを以下のようにnilにしてしまいます。

- (void)dealloc {
  self.teststring = nil;
  [super dealloc];
}

解放済みインスタンスにnilを代入することで、不正なアクセスを防ぐことが出来ます。どうやら、これがメモリリークや不正アクセスの原因となっていた模様。また、delegate=self等のように宣言している場合は、忘れずにdeallocでもnilを入れる必要があります。

ただし、最初からnilにしておくと、カウンタが上がったままになったものを見過ごしてしまい、結果的にメモリリークに繋がる可能性もありますので、最終的にリリースする際にnil書きにしておくといいかもしれません。

詳しくは「iPhoneアプリ開発まっしぐら★」さんのプロパティ解放の記述方法についての提案が勉強になります。プロパティへのnil代入がreleaseの代わりになる理由も合わせて読んでみると幸せになれます。

一般的なメモリリークを調べる方法として、XcodeのProductからAnalyzeをクリックすると、静的なチェックを行うことが出来ます。ここ、開放し忘れてますよと、教えてくれる便利なツールです。

この他にも動的にリークを発見してくれるLeaksというツールもあります。これはXcodeのProductからProfileで使うことが出来ます。

メモリリークについての参考サイト

開発本「iOSデバッグ&最適化技法 for iPad/iPhone」も、メモリリークを調べるための、デバッグツールの使い方について詳細にまとめられていて、勉強になりました。

この記事をシェアする
このエントリーをはてなブックマークに追加

イリテクの最新記事をお届けします

イリテクの最新情報をチェック!
  • follow us in feedly
    RSSで最新記事を読む

イリテクで開発したサービス

請求書作成業務をもっとかんたんに。見積請求書の作成だけでなく、郵送代行、メール送信、PDFダウンロードなどバックオフィスを効率化。

詳しくはこちら

こちらの記事もおすすめです

SPONSER

開発したWebサービス
記事を書いている人
入江 慎吾 ITゼネラリスト
イリテク(株)代表。webシステム、デザイン、iOSアプリ開発に携わって15年目。複数の企業と専属エンジニア契約中。自社で見積請求CLOUD PAPER運営。iPhoneアプリ全国総合ランキング3位を記録。イリテクブログは月間約5万PV。(もっと詳しく
SPONSOR
最新記事
Facebook
Twitter
おすすめ記事