2011-12-05 9 views
1

基本的には、次の事項は基本的に同じですか?この場合には、はい、二つの動作は同じであるのでalloc + initWithStringはコピーと同じですか?

NSString *value1 = ...; 
NSString *value2 = [[NSString alloc] initWithString:value1]; 

NSString *value1 = ...; 
NSString *value2 = [value1 copy]; 

答えて

5

概念的には、はい。ただし、1つの違いがあります。allocは常に新しい文字列を作成しますが、copyは同じ文字列を返すことがあります。

特に、不変の文字列などの不変オブジェクトは、コピーを作成して返すのではなく、自分自身を返すことによってcopyに応答する可能性があります。 (結局のところ、オリジナルについて何も変更できない場合、なぜ本当にコピーが必要でしょうか?)あなたが期待しているように、コピー可能な文字列はコピーを作成して返します。

initWithString:が真ん中にあります:受信者を解放し、受信者を返す方法と同様に、受信者が指定した文字列を返すことがあります。しかし、それが発生した場合は、作成した文字列の作成を無駄にしたことを意味します。alloccopyでは、追加のオブジェクトをまったく作成する必要はありません。

allocinitWithString:を使用する唯一の理由は、NSString独自のサブクラスを持ち、既存の文字列からそのインスタンスを作成したい場合です。 copyはあなたの望むサブクラスを使用しません。 NSStringのサブクラス化はココアでは事実上保証されないので、initWithString:(またはstringWithString:)を使用する場合も同じです。

したがって、最終的にはcopy(またはmutableCopy)を使用してください。それはより短く、あなたの意図をより明確にし、より速くすることができます。

0

非可変文字列は、通常のオブジェクトと比較して、ビット特殊処理されます。ウィットに

:私は次のように出力できます

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 

を、私たちは同じオブジェクトについて話しています。

+0

ポインタには必ず '%p'を使用してください。整数型がポインタと同じサイズか、ポインタの正しい表現であると仮定しないでください。 –

+0

実際は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

関連する問題