4

誰かが次を使用して NSstring を初期化します

NSString *astring = [[NSString alloc] init];

なぜ使用しないのか疑問に思っています

NSString *atring = nil or NSString *astring = @""
4

3 に答える 3

13

と-の間に意味的な違いはありませんが、完全に異なります。最初の 2 つは不変の文字列値への参照を生成し、最後のものは値が存在しないことを示します。NSString *astring = [[NSString alloc] init];NSString *astring = @"";NSString *astring = nil;

長さゼロの文字列を生成するさまざまな方法が異なるオブジェクトを生成するかどうかは、完全に実装の詳細です。コード:

NSString *a = [[NSString alloc] init];
NSString *b = [NSString new];
NSString *c = @"";
NSString *d = [NSString stringWithString:@""];
NSLog(@"%p, %p, %p, %p, %p", a, b, c, d, @""); // %p = print the value of the reference itself

出力 (正確な値は異なります):

0x7fff7100c190, 0x7fff7100c190, 0x1000028d0, 0x1000028d0, 0x1000028d0

長さゼロの文字列オブジェクトが 2 つだけ作成されていることを示しています。1 つは / 用@""、もう 1 つはalloc/用initです。文字列は不変であるため、このような共有は安全ですが、一般的にはそれに依存せず、参照比較 ( ) を使用して文字列を比較しようとするべき==ではありません。

于 2012-07-07T01:23:03.607 に答える
2
NSString *atring = nil

違います -- 空文字列ではなく nil ポインタです。

NSString *astring = @""

のように変更すると、ほとんど同じです。

NSString* astring=[@"" retain];

それは「問題ではない」ことの 1 つです。彼または彼女は単に一方通行を使用しました。多分、特に理由はないです。

于 2012-07-06T23:01:32.917 に答える
2

NSString *atring = nil; ポインターを nil に設定するだけで、ポインターが nil に設定されていることを確認する以外には何もしません。

NSString *astring = @""; 省略リテラルであり、[NSString stringWithString:@""] と同等です。

別の点として、文字列をオーバーライドせずに後で変更できないため、文字列が変更可能でない場合、文字列を何も初期化しない理由がわかりません。

于 2012-07-06T23:01:44.037 に答える