ラベル メモリ管理 の投稿を表示しています。 すべての投稿を表示
ラベル メモリ管理 の投稿を表示しています。 すべての投稿を表示

2012年5月7日月曜日

インスタンスの流儀

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する。