2

最近、Objective-C / iOSプログラムで自動参照カウントを使用していて、この機能を本当に楽しんでいます。

それについて私が理解していないことの1つは、を初期化する適切な方法NSStringです。私はこの方法がARCプロジェクトと非ARCプロジェクトの両方で使用されているのを見てきました。

NSString *myClassicString = [[NSString alloc] initWithFormat:@"My great non-ARC string!"];

NSStringまた、ARCでの初期化には次の方法を使用できることもわかりました。便利なため、次の方法を使用することをお勧めします。

NSString *myARCString = [NSString stringWithFormat:@"My new simple initialization string!"];

これら2つの間に違いはありますか?適切な方法はありますか?どちらが良いですか?

4

3 に答える 3

4

ARC以前は、2つの方法の間に大きな違いがありました。最初のalloc initメソッドは、呼び出し元が所有するオブジェクトを生成しました。手動で解放する必要があります。そうしないと、メモリリークが発生します。もう1つ+stringWithFormat:は、明示的に解放する必要のない自動解放されたオブジェクトを生成する便利なメソッドです。

ARCの場合、この違いは依然として重要です。自動解放されたオブジェクトは、ARCを使用している場合でも、実行ループのサイクルごとにのみ排出されるため、まだ積み重なっています。したがって、自動解放されるオブジェクトを多数作成するループがある場合(つまり、NSStringコンビニエンスメソッドなどを使用する場合)、ピークメモリフットプリントが上がる可能性があります。-alloc -initこのため、バージョンを使用する方が適切です。それを過ぎると、ARCとの違いはほとんどありません。

この回答は、自動解放プールでここで何が起こっているかについての良い説明を提供し、Jonが話している概念はARCコードにも適用されます。これは、ARCが、、、およびを削除しないため-retain-releaseメモリ-autorelease管理コードのそれらの部分を挿入するだけです。君。

そうは言っても、文字列を作成する2つの方法の違いについて心配する必要はおそらくないでしょう。気分が良く、より簡潔で読みやすいコードを作成する方が、より良い方法になります。

于 2012-07-19T02:45:35.557 に答える
2

どちらでも構いません。手動でメモリを管理している場合は扱いが異なりますが、ARCを使用している場合は問題ありません。

于 2012-07-19T02:44:00.810 に答える
2

どちらの方法も同じです。初期化の点で他より優れているものはありませんNSString

于 2012-07-19T02:44:05.877 に答える