1

ARCのインスタンス変数はデフォルトで__strong. 含まれているクラスがまだ保持されている場合、インスタンス変数を解放するにはどうすればよいですか。次の例vでは、__strong

そしてc、Aのオブジェクトがどこかに作成され、保持されるときに割り当てられます。cインスタンス変数を解放したい 。どうすればいいですか? ,インスタンス変数releaseCを解放するメソッドには何が必要ですか.c

@interface A {
  Obj *c;
}

@implementation A {

 - (id)init {
   if((self = [super init])){
     c = [[Obj alloc] init];
   }
   return self;
 }

 - (void)releaseC {
  //what should be here?
 }

}
4

5 に答える 5

2
Obj *c; = [[Obj alloc] init];     

- (void)releaseC {
c = nil;
}

オブジェクトが解放されるタイミングを直接制御することはできませんが、間接的に発生させることはできます。どのように?ARCが正確に何をするか覚えておいてください。人間のコーディング規約とは異なり、ARC はコードを解析し、オブジェクトが解放されるとすぐにリリース ステートメントを挿入します。これにより、新しい割り当てのためにすぐにメモリが解放されます。これは素晴らしい/必要です. つまり、オブジェクトを nil に設定するか、単に変数が範囲外になることを許可します... 0 RETAIN COUNT を発生させると、ARC は強制的に解放呼び出しをそこに配置します。しなければなりません... そうしないと漏れるからです。

于 2013-06-12T04:35:00.947 に答える
2
- (void)releaseC {
    c = nil;
}
于 2013-06-12T04:30:10.230 に答える
2

c = ゼロ;

しかし、効率の観点からは生産的ではないと主張する人もいます。また、使用できなくなったという意味ではすぐに解放されますが、メモリはすぐには解放されない場合があります。

于 2013-06-12T04:30:33.813 に答える
0

ARC で変数を解放する必要はありません。それは自動的に行われました

于 2013-06-12T04:32:07.817 に答える
0

あなたはおそらく自分が何をしたいのかを理解していないでしょう。メモリの問題のために変数を解放したいと思います。あなたがしなければならないのは、それをゼロにすることだけです。インスタンス変数は、オブジェクトへのポインタです。オブジェクトが何かによって指されている限り、そのオブジェクトは生き続けます。何かが必要でなくなったらすぐに、「それを指すのをやめる」ことができ、自動的に解放されます。

設計に関しては、インスタンス変数を解放する public メソッドを使用する理由がよくわかりません。(そうでない場合は、実際にメソッドを記述しなくても nil になるため、パブリックであると想定しています)。クラスの外部からインスタンス変数を解放できるようにするつもりなら、単純にインスタンス変数をパブリックにして、それを nil に設定してどこからでも解放します。

于 2013-06-12T05:20:42.480 に答える