コンテンツへスキップ →

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

スキルアップにMENTA

MENTAはいろんなプロに相談できるNo1メンターサービスです。

僕自身もプロダクトの壁打ち・相談にのっています。個人開発でもコードレビュー、セキュリティ面のチェック、デザイン、広告、コンテンツマーケ、SNS集客について相談する、など使えます。

YouTubeでも発信中!

PROFILE

入江 慎吾
あらゆるスキルが学べるパーソナルメンターサービスMENTAの代表/個人開発が好きでこれまでに30個ほどのWEBサービスやアプリを作ってきました/福岡のWEB制作会社勤務→フリーランスエンジニア→法人立ち上げ→M&A億単位の売却を経験。 (詳しいプロフィール)

カテゴリー: 開発奮闘記