2012-01-27 9 views
1

私は質問が十分にまだ明らかだと思う - の違いは何です:NSString * s = @ "string"とNSString * s = [[NSString alloc] initWithString:@ "string"]の違いは何ですか?

NSString *string = @"Hello world!"; 

NSString *string = [[NSString alloc] initWithString:@"Hello world!"]; 

thisはすでにそれを答えるなら、私に教えてください。ココア命名規則としてココアパー

+0

この質問は定数文字列に関するものであるため、別の投稿への参照は同じではありません。 – zaph

答えて

11
NSString *string = [[NSString alloc] initWithString:@"Hello world!"]; 

、あなたは名前「ALLOC」、「新」、「コピー」、または「mutableCopy」で始まるメソッドを使用してオブジェクトを作成します。これはあなたが上記の文字列を所有していることを意味します。したがって、あなたはオブジェクトを解放する責任があります。

NSString *string = @"Hello World"; 

上記の行は文字列リテラル/定数ですが、それを割り当てたり解放することはできません。あなたはこのオブジェクトを所有していません。

+4

実際この場合、コンパイラの「スマート」のために実際に違いはありません。文字列定数の参照カウント(MAXINT)が非常に大きいため、コンパイラは2番目の例を最初のものと同じに扱います。 – zaph

+0

知りたいことは面白いですが、実際これについてもっと読むことができますか?乾杯。 –

+0

文字列リテラルを所有していないと、アプリケーション実行中に存在することになりますか? – daLizard

1

NSString *string = [[NSString alloc] initWithString:@"Hello World!"]; 

このコードは、強い参照を作成し、変数を保持します。次に、 "Hello World!"という値を割り当てます。それに。

NSString *string = @"Hello World!"; 

このコードでは、単に「Hello World!」という値を割り当てます。 NSStringオブジェクトに追加します。どのような種類の参照も作成していません。オブジェクトがまだ初期化されずに保持されていない場合、オブジェクトは実行中のスコープの最後で破棄されます。

関連する問題