4
  1. NSString *myString = @"Hello";

  2. NSString *myString = [NSString stringWithString:@"Hello"];

メソッド (1) を使用すると、静的メモリとして定義された (そして解放できない) 文字列リテラルへのポインターが作成され、(2) を使用すると、自動解放される NSString オブジェクトが作成されることを理解しています。

  • (1)の方法はまずいですか?
  • 主な違いは何ですか?
  • (1) を使用したい場合はありますか?
  • 性能差はありますか?

PSスタックオーバーフローで広範囲に検索しましたが、同じトピックに関する質問がありますが、上記の質問に対する回答はありません。

4

1 に答える 1

6

この回答で指摘されているように、文字列リテラルは不変の文字列オブジェクトであり、コンパイル時にアドレスを取得します。したがって、実行時に同じ文字列文字列の複数のインスタンスを作成する必要はありません。

NSString *myString = @"Hello";

したがって、ここでは、myStringを文字列リテラルへのポインタに割り当てるだけです。

NSString *myString = [NSString stringWithString:@"Hello"];

2行目は、コンビニエンスコンストラクターを使用してオブジェクトを作成しますが、ここでは不変オブジェクトを処理しているため、文字列リテラルへのポインター値は同じになります。したがって、最初のバリアントと同じ結果が得られます(ただし、おそらくいくつかの追加のメソッド呼び出しを実行します)。

したがって、あなたが言及したバリアントは同じことを行うようですが、2番目のバリアントもいくつかの追加の呼び出しを実行する可能性があります。

何が起こるかを示す小さなサンプル:

NSString* tString = @"lala";
NSString* tString2 = @"lala";   
NSString* tString3 = [NSString stringWithString:@"lala"];
NSString* tString4 = [NSString stringWithFormat:@"%@", @"lala"];

NSLog(@"%p %d", tString, [tString retainCount]);
NSLog(@"%p %d", tString2, [tString2 retainCount]);
NSLog(@"%p %d", tString3, [tString3 retainCount]);
NSLog(@"%p %d", tString4, [tString4 retainCount]);

出力:

 0xd0418 2147483647
 0xd0418 2147483647
 0xd0418 2147483647
 0x50280e0 1
于 2010-06-16T11:15:59.517 に答える