-2

重複の可能性:
ローカル変数の割り当てと直接割り当て。プロパティとメモリプロパティでメモリ
を割り当てる正しい方法はどちらですか?

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

1:

NSString *someString = @"Blabla";


{...Some code...}


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

2:

NSString *someString = @"Blabla";


{...Some code...}


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

何らかの理由で、Xcode Analyzerは、オプション#1がメモリリークを引き起こす可能性があることを警告します。そのため、コードをオプション#2に変更しても、Analyzerは警告を表示しません。

誰かがその理由を知っていますか?

どうもありがとうございます!

4

3 に答える 3

1

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

[str release];

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

ARCの詳細については、「新しい自動参照カウントメカニズムはどのように機能しますか?」を参照してください。

于 2012-05-11T16:22:52.460 に答える
0

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

(単純な例では実際のリークが発生しない可能性があるという事実を無視します。しかし、それは重要ではありません。それでも、ここでそのメモリを管理する正しい方法ではありません)

于 2012-05-11T16:14:30.613 に答える
0

最初の例の問題:

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

imageView.titleこれは、alloc / initを介して文字列を割り当て、retainプロパティである文字列を割り当てることです。実際、allocは保持カウントが1のオブジェクトを提供します。プロパティに割り当てるとretain、保持カウントも増加します(2)。これで、imageViewの割り当てが最終的に解除されると、そのdeallocメソッドはtitleプロパティを解放します(したがって、保持カウントを1ずつ減らします)が、オブジェクトの割り当てを解除することはありません。これはrelease、自分のバランスを取るためにもう一度呼び出す機会がないためですalloc

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

これが最初の例を修正する方法です:

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

また

imageView.title = [NSString stringWithString:someString];

これは、慣例により自動解放されたオブジェクトを提供するコモディティコンストラクターの使用に依存しています。

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

于 2012-05-11T16:30:08.650 に答える