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