0

メモリ管理について質問があります。以前に init* メソッドで割り当てたインスタンス変数があります。プログラムのある時点で、このオブジェクトを保持しました。私の dealloc メソッドで、このオブジェクトを nil に設定した場合、彼は正しく割り当て解除されますか? 例を示しましょう。これは Ah クラスです:

@interface A: NSObject {
  B *bvariable;
}
-(id) init;

と彼の実装:

 @implementation A

  -(id) init: { 
      bvariable= [[B alloc] init];


       /**
        *  Let say for some reason, I called   
       */   
       [bvariable retain];
   }
}

-(void) dealloc {
     bvariable = nil;
     [super dealloc];
}

私の質問は、GC がいつA クラスでdeallocを呼び出すかということです。bvrariableは適切に割り当て解除されますか?

私はこのオブジェクトを保持しているので、そのオブジェクトを解放するにはreleaseを 2 回呼び出す必要があるため、私の推測ではノーです。オブジェクトを nil に設定しても、メッセージを bvrariable オブジェクトに送信しているため、それらの割り当ては解除されません。しかし、ある人は私に反対のことを言いました。

誰かが私を啓発できますか?

アドバイスありがとうございます !!

4

2 に答える 2

0

一般に、alloc / init / copy / newで始まるすべてのメソッドは、保持されたオブジェクトを返す必要があります。このオブジェクトを再度保持する場合、保持カウントは2です。オブジェクトを完全に解放するには、2回解放する必要があります。

オブジェクトをnilに設定したときにオブジェクトを解放するという話は、ガベージコレクション(GC)を使用する場合にのみ適用されます。これは現在iOSでは利用できません。MacOSでのみ利用できます。

于 2011-04-02T17:42:46.497 に答える
0

私の質問は、GC がいつ A クラスで dealloc を呼び出すかということです。bvrariable は適切に割り当て解除されますか?

いいえ、

1) GC は iOS メモリ管理では使用されません。

2)deallocこのポインターをnil(deallocで行うのはまったく無意味なことです)に設定するだけです-オブジェクト自体は解放または/および割り当て解除されません。

私はこのオブジェクトを保持しているので、そのオブジェクトを解放するには release を 2 回呼び出す必要があるため、私の推測ではノーです。

右。ところで、このオブジェクトを後で保持する正当な理由がわかりませんalloc。あなたはすでにその所有権を主張しています。

于 2011-04-02T16:37:20.900 に答える