Obj.C

obj.C:メモリリーク

メソッドについてまとめていたら、引数が2つ以上のときのサンプルコードでハマってしまいました。

要は、変数名が重複しているというエラーであるLocal Declaration of “xxx” Hides Instance Variableが出てしまい、原因をすぐに探し出せませんでした。これもまた、ヘッダの@interface {  }のインスタンス変数とメソッドの定義の変数の名前が一緒だったことが問題の原因でした。今後は、@interface {  }の中のものをすぐに疑うようにします。グローバル変数をためしたときの消し忘れです。引数については、Objective-C基礎3が参考になりました。また、継承については、違うサイトになりますがObjective-Cの基礎クラスの継承を理解するがきれいにまとまっていました。

スクリーンショット 2014-01-12 15.59.16

ローカル変数について調べているうちに、なぜメモリリークが起きるか説明してあるサイトに行き着きました。自分なりに理解し直す(まとめ直す)と次のようになります。

  • 変数は、グローバル変数とローカル変数の2種類に分かれる。
  • グローバル変数はアプリケーションが起動中ずっとメモリを占有。
  • ローカル変数はメソッド内で作成され終了する時に自動的に破棄される
  • ところが、オブジェクトはポインタ(ローカル変数)として引き渡され、メソッドが終了する時にポインタ自体は自動的に 破棄されるが、オブジェクトはメソッドの外側(スコープ外)に作られたままになる。したがってメソッドが終 了しても自動的に破棄されない。メソッドが呼ばれるたびに無用なオブジェクトがメモリに残っていき、メモリリークとなる。

なぜメモリリークが起きるかの説明の続きには、当然、対策編も書いてあります。それは今ではなく、いつか近いうちに試すことになるまで取っておきます。