PHPerです。なぜかすみませんな感じになってしまいます。
メモリ管理
Objective-Cでは、メモリ管理をプログラマが行います。PHPはガベージコレクションという機能があり、意識しなくてもよかったのです。そう、今まで相当な楽をしてコーディングしていたツケが回ってきましたよ。
PHPのインスタンス生成は、newでした。Objective-Cでは、allocメソッドで生成します。
インスタンス生成後、メモリにコピーされたということは、ちゃんと管理しなくちゃいけません。
Objective-Cでよく目にする下のコード
NSDateクラスをalloc(インスタンス生成)後に、initメソッドを呼び出しています。
d = [[NSDate alloc] init ]
そう、生成されたインスタン変数dを、利用後に解放しなくてはいけない。
解放はreleaseメソッドで行います。これでメモリ上に確保された領域が解放されるはずです。
[d release];
はず?以下のコードから
NSDate *d1 = [[NSDate alloc] init];
NSDate *d2 = d1;
d1もd2も同じ領域を参照している為、d2をrelease(解放)すると、d1もreleaseされてしまいます。参照を管理する為にObjective-Cには保持カウンタ(参照カウンタ)という機能が用意されています。
保持カウンタ(参照カウンタ)
release(解放)は、必ず解放されるとは限りません。本来releaseというのは保持カウンタ(参照カウンタ)を1減らして、保持カウンタの値が0の場合はインスタンスを削除する仕様になります。
ではこの保持カウンタ(参照カウンタ)を+1するにはどうすればいいのか。
その為のメソッドがretain(保持カウンタ+1)になります。
つまり参照する時に、retainすることで保持カウンタを1進めることで
うまい具合に管理してくれというObjective-Cからのメッセージが込められています。
NSDate *d1 = [[NSDate alloc] init];
NSDate *d2 = d1;
[d retain] //ここで保持カウンタを+1する。
[d retainCount] //現在の保持カウンタを確認。
[d release]; //保持カウンタを-1する。