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

2011/08/22 (2018/02/09更新) カテゴリー:開発奮闘記 タグ: , ,
  • このエントリーをはてなブックマークに追加
SPONSOR

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

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

記事が気に入ったら、シェアしていただけるとうれしいです!

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

おすすめの記事

SPONSOR

ABOUT

イリテクブログについて

ITエンジニア向けに、「専門知識でかせぐ」ためのノウハウをブログで更新中です。
WEBアプリスマホアプリ開発まわりの話、 生産性を高めるアイデアリモートワークや働き方ビジネスに役立つ本の紹介ビジネスハック生産をあげるITツールの紹介 などをテーマに記事を書いています。
気に入ったらフォローして最新情報をチェック!
  • follow us in feedly
    RSSで最新記事を読む

RELATION

関連する記事

SPONSOR

RECOMMEND

おすすめの記事

TAG

タグから記事をさがす

PROFILE

イリテクのプロフィール

イリテクはWEBシステム・スマホアプリ開発を得意とする制作会社です!
入江 慎吾/イリテク株式会社 代表取締役
1982年生まれ。長崎県 五島列島出身。福岡のWeb制作会社で10年間、ディレクション、Webデザイン、システム開発に従事。 その後、趣味で始めたiPhoneアプリ開発をきっかけにフリーランスとして独立後、2014年にイリテク株式会社として法人化。(もっと詳しいプロフィール)

PRODUCT

イリテクで開発したプロダクト

SPONSOR