Skip to content →

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

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

落ちるタイミングとして、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の代わりになる理由も合わせて読んでみると幸せになれます。

[sc name=”ios”][sc name=”engeneer”]

SHARE

PROFILE

入江 慎吾
イリテク株式会社代表取締役 / メンターマッチングサービスMENTAを運営(月間流通額700万突破)/ 累計20個以上のWEBサービスやアプリを開発 / CAMPFIREとコミュニティツールVoyageを共同開発中 / 「自分のサービスで生きていく」をコンセプトに個人開発オンラインサロン「入江開発室」を運営(詳しいプロフィール)

SPONSER

Published in 開発奮闘記