woshidan's loose leaf

ぼんやり勉強しています

1.2 メモリ管理

Markdown方式に変えたはいいものの、見出しの書き方が落ち着きません。

メモリ管理

Objective-Cでのメモリ管理の方法

Objective-Cではインスタンスへの参照回数が1以上であればメモリ領域が確保され続けます。 たしか、Cではメモリの領域の確保・解放にmalloc, freeなどのメソッドがありましたが、
Objective-Cにもオブジェクトのretainメソッド、releaseメソッドなどで手動でメモリを管理するメソッドがあります。

MRR

プログラマがこれらのメソッドを書くことでメモリを管理する方法をMRR(ManualRetain-Release、明示的に記述したコードによる獲得と 解放)といいます。

ARC

一方、ARC(Automation Reference Counting、自動参照カウント)という方法は、最終的にメモリ管理メソッドがクラスに記述されているのは同じですが、コンパイラが自動的にメモリ管理メソッドを補完します。そして、ARCを用いる場合、手動でメモリ管理メソッドを挿入するとエラーが出てビルドが出来ません。

参照の種類

メモリの参照には強参照と弱参照があるそうです。

以下、 https://github.com/mixi-inc/iOSTraining/wiki/1.2-%E3%83%A1%E3%83%A2%E3%83%AA%E7%AE%A1%E7%90%86 より引用。

強参照

参照先のオブジェクトのオーナーシップを持つ。自分がそのオブジェクトの参照を無くすまで確実に参照することができる。デフォルトこの設定

弱参照

参照先のオブジェクトのオーナーシップを持たない。そのオブジェクトが破棄されたら参照できなくなる。delegate や blocks 使うときに主に使用

インスタンスのメモリが削除されるまでには、自分を参照しているオブジェクトの数を記録していてそれが0になったら削除できるようになるようなので、説明を見ている限り、強参照では、自分をその参照オブジェクトの頭数に入れさせる、弱参照では入れさせない、ということなのでしょうか。

循環参照

2つのオブジェクト間で相互に強参照を持つと循環参照が起きてしまうので、片方の参照を弱参照にして回避します。

Obj-Cは参照カウント方式なのでコールバックを実装する時に弱参照が必要になる

を思い出したのですが、http://qiita.com/KeithYokoma/items/d6c3bd07fc57b93f91ccを読んでもあまりよく分からなかったのです、もう少し慣れてからまた読みます。

循環参照の例を図に直して思ったのですが、

NSObject *obj = [[NSObject alloc] init];

の左辺の*objはオブジェクト構造体へのポインタなんですね。