iOSアプリ・Webサービス開発のイリテク

HOME > iOS プログラミング > iPhoneアプリがメモリリークや不正アクセスで落ちてしまう時の対策
2011.08.22

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」も、メモリリークを調べるための、デバッグツールの使い方について詳細にまとめられていて、勉強になりました。

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

記事を書いている人

イリテク(株)代表。Webシステム/iOSアプリの開発を行っています。
受託開発だけでなく、月額固定の専属エンジニアサービスおよび、 自社でクラウド見積請求書サービス CLOUD PAPERを運用中!
プロフィール

月額10万円で御社専属エンジニアを雇いませんか?

御社の顧問エンジニアとして、デザイン・システムに関わる様々なご相談をお受けします。企画・提案だけでなく、実際に手を動かして開発まで行います。また、システムにとどまらず、デザイン案件もお受けできるのが強みです。
顧問エンジニアサービス

イリテクの最新記事をフォロー

  • follow us in feedly
    RSSで最新記事を取得

SPONSER

コメントをどうぞ!

関連記事