2011-07-30 4 views
0

可能性の重複:
Use autorelease when setting a retain property using dot syntax?iPhone ivarsとselfを使って:autoreleaseは必要ありませんか?

アイバーズと自己を使用しての違いは何ですか。表記法?

instanceVarは、retainと宣言されたインスタンス変数です。

1)instanceVar = [[NSMutableArray alloc] initWithObjects:@ "1"、@ "2"]; //ここで自動解放が必要ですか?

2)self.instanceVar = [[NSMutableArray alloc] initWithObjects:@ "1"、@ "2"] autorelease];

また、最初の状況で自動解放が必要ですか?

+0

他にもたくさんあります。[検索:objcプロパティautorelease](http://stackoverflow.com/search?q= [objc] + retain + property + autorelease) –

答えて

2

これは、複数の場所で説明したが、思われる

最初の呼び出しが変更されず、次のようになります。

instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; 
self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; 
// The previous line will compile to this next line 
[self setInstanceVar:[[NSMutableArray alloc] initWithObjects:@"1", @"2"]]; 

- (void)setInstanceVar:(NSMutableArray *)instanceVar;メソッドの本体が原因でこのような何か(コンパイラあなたのためにこれを作るになります:コンパイルされたときに0秒の呼び出しは、あなたがretain@synthesize@propertyを使用していると仮定すると(このようになります。あなたの@property@sythesize):コールでそのため

- (void)setInstanceVar:(NSMutableArray *)anInstanceVar 
{ 
    if (instanceVar != anInstanceVar) { 
     [instanceVar release]; 
     instanceVar = [anInstanceVar retain]; 
    } 
} 

self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; 

新しく作成されたNSMutableArrayに+1保持カウントがあり、設定者を経由して+1保持カウントが追加されました。

これは、あなたが取っているリザーブにマッチするために追加のリリースが必要であることを意味します。 iPhoneでautoreleaseを使用しない方が良いと考えられますので、必要なときにメモリが解放されていることを確認できます。したがって、あなたは通常

セッターを通じて
  • リリースローカルvarは次のようになります
  • (@jamapagに固定おかげで)アイバーする地元のVARを作成

  • 割り当てローカルVARをパターン

    1. を取る必要があります
      NSArray *tmpMyArray - [[NSArray alloc] initWithObject:@"Hello"]; 
      self.myArray = tmpMyArray; 
      [tmpMyArray release]; tmpMyArray = nil; 
      
  • +0

    最後の例では、自動解放されたNSArray(allocなし)を作成したので、解放する必要はありません。正しいコードは次のとおりです。 '[[NSArray alloc] initWithObject:@" Hello "]' – jamapag

    +0

    良いスポットは、テストなしでブラウザで急いでコード化しようとしました –

    +0

    最後の例はなぜ優れていますか?それらのすべてでは、配列はdeallocで割り当てが解除されるまで、メモリ内にあるようです。 –

    0
    1) instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; //do I need autorelease here????? 
    

    NSMutableArrayのは1の保持カウントを使用して作成され、あなたがセッターを使用している、そしてそれはretainそれで宣言されているので、あなたのdealloc()方法ここで

    2) self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"] autorelease]; 
    

    であなたのinstanceVarを解放する必要がありますその保持カウントが1増加すると、alloc initはすでに保持カウントを1増加させているので、総保持カウントは2です。しかし、自動解放msgは、次回の実行ループで1 probabyteを減らします。だからあなたのdealloc()メソッドでこれを解放するだけです。これはおそらく、再びそれを使用したいと思うでしょうイヴァーで、あなたautorelease場合、それは保持カウントが次ですぐに0(最も可能性が高くなりますので、あなたはおそらくは、自動解放したくない第1の状況で

    あなたは異なるが何であるかを尋ねたとして実行するループ)

    関連する問題