Objective-C のメモリ管理について疑問があります。
-(void)viewDidLoad
{
NSNumber *num=[[NSNumber alloc] initWithInt:10];
[num release];
NSLog(@”%i”,num);
}
上記のコードは、値を出力することで正常に機能しています。しかし、オブジェクトがリリースされるとすぐに、その値は失われますよね? では、どうしてうまく機能するのでしょうか。
Objective-C のメモリ管理について疑問があります。
-(void)viewDidLoad
{
NSNumber *num=[[NSNumber alloc] initWithInt:10];
[num release];
NSLog(@”%i”,num);
}
上記のコードは、値を出力することで正常に機能しています。しかし、オブジェクトがリリースされるとすぐに、その値は失われますよね? では、どうしてうまく機能するのでしょうか。
これが何が起こっているかです。最初にこれを行います:
NSNumber *num=[[NSNumber alloc] initWithInt:10];
変数にはオブジェクトnum
へのポインターが含まれるようになり、( を使用したため) そのオブジェクトを所有しています。次に、これを行います。NSNumber
alloc
[num release];
オブジェクトに送信release
したとき、あなたはそのオブジェクトの所有権を放棄しました。オブジェクトがまだ存在していて変更されていないか、破棄されている可能性があります。あなたは知りません。変数num
にはまだ同じポインターが含まれていますが、変数が指すメモリは現在有効なオブジェクトではない可能性があるため、そのオブジェクトにメッセージを安全に送信できません。
次に、これを行います。
NSLog(@”%i”,num);
このNSLog
ステートメントでは、整数をフォーマットするため、ポインタとしてではなく整数num
として扱っています。オブジェクトがあったアドレス (メモリの場所) を印刷しているだけです(まだあるかもしれません - あなたにはわかりません)。したがって、有効なオブジェクトを指しているかどうかは問題ではありません。任意の int として扱っているだけです。オブジェクトにメッセージを送信しようとしていません。%i
NSNumber
num
num
NSNumber