1

Foundation アプリの 2 つの Objective-C コードを次に示します。このコードは関数内にあります。

    [arrayOfObjects addObject:[[TheShape alloc] init]];
    NSLog(@"%@", arrayOfObjects); // log verifies "<TheShape..." is in the array
    [arrayOfObjects release];

そして、私の TheShape クラスには、このdeallocオーバーライド メソッドがあります。

    - (void)dealloc {
        NSLog(@"TheShape dealloc called.");
        [super dealloc];
    }

私のプログラムは別の方法では動作しますが、期待どおりには動作しません。メッセージが送信されると、[arrayOfObjects release]"TheShape dealloc..." という文字列がログに表示されるはずです。そうではありません。

Q1: なぜですか?

だから私は少し掘り下げて物事を単純化します。次のような簡単なことをすると:

    TheShape *aShape = [[TheShape alloc] init];
    [aShape release];

デバッグ メッセージはまだログに表示されません。

Q2: なぜですか?

しかし、私がこれを行うと:

    TheShape *aShape = [TheShape new];
    [aShape release];

デバッグ メッセージログに表示されます。最初のサンプルの alloc/init も に変更すると、デバッグ メッセージもログに表示されますnew

Q3: なぜですか?

明らかに、alloc/init/release サイクル (Q の 1 および 2) と、newおよびalloc/init(Q3) の想定される等価性に概念的な何かが欠けています。私のように、考えるのが難しい人のために、もう少し物事を説明するチュートリアルを教えてもらえますか?

ありがとう、

明細書

4

2 に答える 2

5

+newひょっとして、クラスをオーバーライドしましたか? とまったく同じことをしているはず+alloc/-initです。

いずれにせよ、あなたの最初の行

[arrayOfObjects addObject:[[TheShape alloc] init]];

インスタンスがリークしていTheShapeます。あなたはそれをに変えるべきです

[arrayOfObjects addObject:[[[TheShape alloc] init] autorelease]];
于 2011-01-25T01:44:32.360 に答える
1

メソッドが呼び出される理由はありませんdealloc 。オブジェクトにはゼロ以外の参照カウントがまだあります。

オブジェクトを作成するたびに、その存在は参照カウント 1 で始まります。このカウントが 0 になると、割り当てが解除されます。私たち全員が正気を保つのに役立つ、メモリ管理に関する特定のルールがあります。これらの規則は「オブジェクトの所有権」について語っています。

基本的に、次の条件のいずれかを満たすと、オブジェクトの所有者になります。

  • retainオブジェクトを呼び出します。
  • copyまたはmutableCopy別のオブジェクトを呼び出してオブジェクトを取得します。
  • allocオブジェクトでメソッドを呼び出します。

オブジェクトを所有しているときはいつでも、それが不要になったら解放する責任があります。誰もそれを必要としない場合にのみ削除されます。

スニペットでは、配列に渡すオブジェクトを作成しますあなたの配列はそれを使用し始めるので、それを呼び出しますretain(したがって、保持されている間は生き続けます)。ただし、release配列を取得したら、メソッドを呼び出したので、オブジェクトを解放する必要がありますalloc


編集簡単なスニペット:

TheShape *aShape = [[TheShape alloc] init];
[aShape release];

ただし、メッセージを表示する必要があります。:/

これが起こらないことがわかる理由は 2 つあります。

  • allocinitまたはメソッドのいずれかで奇妙なことをしreleaseました(この場合、コードを投稿してください)。
  • ガベージコレクションされた環境で実行され、dealloc呼び出されることはありません (finalizeこの場合は使用する必要があります)。+newその場合、なぜrelease期待される結果が得られるのかわかりませんが。
于 2011-01-25T01:47:16.883 に答える