2012-05-11 9 views
-2

可能性の重複:
Local variable assign versus direct assign; properties and memory
Which way is the correct way to allocate memory with a property?のObjective-CのNSStringのメモリ管理

私は、この2つのコード例との違いを知りたいと思いました。

1:

NSString *someString = @"Blabla"; 


{...Some code...} 


imageView.title = [[NSString alloc] initWithString:someString]; 

2:私はオプション#2に自分のコードを変更すると

NSString *someString = @"Blabla"; 


{...Some code...} 


NSString *str = [[NSString alloc] initWithString:someString]; 
imageView.title = str; 
[str release]; 

XcodeのAnalyzerは私にそのオプション#1を警告何らかの理由でメモリに発生する可能性がありますのでleak-アナライザは私に警告しません。

誰でも知っていますか?その理由は何ですか?

ありがとうございました!

+0

[ローカル変数代入と直接代入の可能な重複;プロパティとメモリ](http://stackoverflow.com/questions/3066848/)、http://stackoverflow.com/questions/7395253/、http://stackoverflow.com/questions/8605078/、http:// stackoverflow .com/questions/7017046 /、http://stackoverflow.com/questions/5447063/、http://stackoverflow.com/questions/2818254/などです。 –

+0

オプション2では、リリースしたのに対し、1ではリリースしていません。警告です。 – zahreelay

答えて

1

あなたはARCを使用していないと仮定すると、

[str release];

ラインはここで重要です。その行を最初のスニペットの最後に追加して、同じ警告が表示されるかどうかを確認してください。オブジェクト上のallocを明示的に呼び出すと、参照カウントがインクリメントされます。参照カウントを減らすには、releaseを呼び出す必要があります。

ARC上の情報については以下を参照してくださいHow does the new automatic reference counting mechanism work?

0

最初の例では、新しいNSStringを割り当てて渡し、それを解放しませんでした。その文字列を解放するのはあなたが責任を負います。最初の文字列を割り当てたときに保持カウントが+1になります。

(あなたの簡単な例は、おそらく実際のリークが発生しないという事実を無視する。しかし、それはポイントではありません、それはまだここにそのメモリを管理するための正しい方法ではありません)

0

問題をあなたの最初の例では:

NSString *someString = @"Blabla"; 
{...Some code...} 
imageView.title = [[NSString alloc] initWithString:someString]; 

は、あなたが/アロケーションを通じて割り当てた文字列を初期化し、imageView.titleにそれを割り当てることであるretainプロパティがあります。確かに、allocは保持カウントが1のオブジェクトを与えます; retainプロパティに割り当てると、保持カウント(2)も増えます。イメージビューが最後に割り当て解除されると、deallocメソッドはtitleプロパティを解放します(保持カウントを1減らします)。を再度呼び出してallocを呼び出す機会がないため、オブジェクトの割り当てが解除されません。

ここで注目すべき重要なことは、retainプロパティに割り当てていることです。 titleは保持プロパティではなく、コードは問題ありませんでした。

imageView.title = [[[NSString alloc] initWithString:someString] autorelease]; 

または

imageView.title = [NSString stringWithString:someString]; 

あなたの慣例により自動解放オブジェクトを与える商品コンストラクタの使用に依存している:

これは、あなたの最初の例を修正することができる方法です。

(2番目の例では正しい方法ですが、少し冗長です)。