0

Objective-C のメモリ管理について疑問があります。

-(void)viewDidLoad
{
NSNumber *num=[[NSNumber alloc] initWithInt:10];
[num release];
NSLog(@”%i”,num);
}

上記のコードは、値を出力することで正常に機能しています。しかし、オブジェクトがリリースされるとすぐに、その値は失われますよね? では、どうしてうまく機能するのでしょうか。

4

2 に答える 2

1

これが何が起こっているかです。最初にこれを行います:

NSNumber *num=[[NSNumber alloc] initWithInt:10];

変数にはオブジェクトnumへのポインターが含まれるようになり、( を使用したため) そのオブジェクトを所有しています。次に、これを行います。NSNumberalloc

[num release];

オブジェクトに送信releaseしたとき、あなたはそのオブジェクトの所有権を放棄しました。オブジェクトがまだ存在していて変更されていないか、破棄されている可能性があります。あなたは知りません。変数numにはまだ同じポインターが含まれていますが、変数が指すメモリは現在有効なオブジェクトではない可能性があるため、そのオブジェクトにメッセージを安全に送信できません。

次に、これを行います。

NSLog(@”%i”,num);

このNSLogステートメントでは、整数をフォーマットするため、ポインタとしてではなく整数numとして扱っています。オブジェクトがあったアドレス (メモリの場所) を印刷しているだけです(まだあるかもしれません - あなたにはわかりません)。したがって、有効なオブジェクトを指しているかどうかは問題ではありません。任意の int として扱っているだけです。オブジェクトにメッセージを送信しようとしていません。%iNSNumbernumnumNSNumber

于 2012-08-02T04:25:50.353 に答える
-1
  1. オブジェクトで [release] を呼び出すことにより、オブジェクトの保持カウントを減らすことができます。
  2. copy、new、alloc を持つメソッドを呼び出すことによってオブジェクトが作成された場合、呼び出し元はそのオブジェクトの所有者であると言われ、所有者は所有しているオブジェクトを常に解放する必要があります。
  3. オブジェクトを所有していない場合は、解放しないでください。
  4. オブジェクトが保持されている場合は、常にオブジェクトに対して release を呼び出します。つまり、retain メソッドを呼び出す場合は、対応する release 呼び出しを呼び出す必要があります。Retain release を一致させる必要があります。
于 2012-08-02T04:10:14.080 に答える