基本的には、次の事項は基本的に同じですか?この場合には、はい、二つの動作は同じであるのでalloc + initWithStringはコピーと同じですか?
NSString *value1 = ...;
NSString *value2 = [[NSString alloc] initWithString:value1];
と
NSString *value1 = ...;
NSString *value2 = [value1 copy];
基本的には、次の事項は基本的に同じですか?この場合には、はい、二つの動作は同じであるのでalloc + initWithStringはコピーと同じですか?
NSString *value1 = ...;
NSString *value2 = [[NSString alloc] initWithString:value1];
と
NSString *value1 = ...;
NSString *value2 = [value1 copy];
概念的には、はい。ただし、1つの違いがあります。alloc
は常に新しい文字列を作成しますが、copy
は同じ文字列を返すことがあります。
特に、不変の文字列などの不変オブジェクトは、コピーを作成して返すのではなく、自分自身を返すことによってcopy
に応答する可能性があります。 (結局のところ、オリジナルについて何も変更できない場合、なぜ本当にコピーが必要でしょうか?)あなたが期待しているように、コピー可能な文字列はコピーを作成して返します。
initWithString:
が真ん中にあります:受信者を解放し、受信者を返す方法と同様に、受信者が指定した文字列を返すことがあります。しかし、それが発生した場合は、作成した文字列の作成を無駄にしたことを意味します。alloc
。 copy
では、追加のオブジェクトをまったく作成する必要はありません。
alloc
とinitWithString:
を使用する唯一の理由は、NSString独自のサブクラスを持ち、既存の文字列からそのインスタンスを作成したい場合です。 copy
はあなたの望むサブクラスを使用しません。 NSStringのサブクラス化はココアでは事実上保証されないので、initWithString:
(またはstringWithString:
)を使用する場合も同じです。
したがって、最終的にはcopy
(またはmutableCopy
)を使用してください。それはより短く、あなたの意図をより明確にし、より速くすることができます。
非可変文字列は、通常のオブジェクトと比較して、ビット特殊処理されます。ウィットに
:私は次のように出力できます
NSString *str1 = @"string";
NSString *str2 = [str1 copy];
NSString *str3 = [[NSString alloc] initWithString: str1];
NSLog(@"str1: %p, str2: %p, str3: %p", str1, str2, str3);
:ポインタアドレスが同じであるため
str1: 0x108a960b0, str2: 0x108a960b0, str3: 0x108a960b0
を、私たちは同じオブジェクトについて話しています。
ポインタには必ず '%p'を使用してください。整数型がポインタと同じサイズか、ポインタの正しい表現であると仮定しないでください。 –
実際はdocs(http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265)でこれを見ました: %pは出力の先頭に0xを追加します。そのようにしたくない場合は、%lxを使用してlongにキャストしてください。それは問題ではないが、アップルは%lxの使用についてあまり気にしていないようだ(もちろん、適切なキャストで)+ – Monolo