2009-08-21 4 views
1

私はNSStringを持っており、その値をNSMutableStringに書きたいと思います。これは有効です。Cocoa String Question

NSString *temp = [NSString stringWithString:@"test"]; 
NSMutableString *mutable = temp; 

これはなんとかようだが、私はこれは一時と同じアドレス空間に変更可能なの両方を割り当てると思うだろうので、私が尋ねます。メソッドに値を渡したり、メソッドから値を返すときには、この質問がたくさんあります。他の人がこれをやったり、stringWithStringやinitWithStringで可変文字列を作成したりすることがあります。これが作成されます

NSString *temp = [NSString stringWithString:@"test"]; 
NSMutableString *mutable = [temp mutableCopy]; 

:ありがとう

答えて

10

あなたは受信機の可変コピーを作成し、(NSStringはそのうちの一つとなっている)NSMutableCopyingプロトコルを採用している任意のクラスに適用されるmutableCopy方法を、使用することができます文字列の変更可能なコピーを新しい文字列インスタンスとして返します。この場合は適用されません。tempはオートレリースされた文字列ですが、不要になった場合はコピーした古い文字列を解放する必要があります。

mutableCopyには「コピー」が含まれているため、新しい文字列をメモリ管理する必要があります(Apple Object Ownership Policyに従って所有権を取得してください)。

以前にインスタンス化されたNSStringへのポインタとして、単にmutableを割り当てます。

5

多くの人とココアを混乱させるようなものは、変数とオブジェクトの違いです。

NSMutableString *mutableなどの変数を宣言するときは、文字列を作成していないことに注意してください。これはタイプNSMutableString*のポインタ変数です。構造的には、他のポインターと同じです。そして、「ポインター」が意味するように、実際に他の場所に存在するものを指しています。このため、技術的には任意のオブジェクトを指すように割り当てることができます。しかし、あなたはそのオブジェクトを可変文字列に変換しているわけではありません。オブジェクトにNSMutableStringだけが応答できるメッセージを送信しようとすると、ジグがアップしています!

Perspxによると、変更したい文字列がある場合は、mutableCopyメソッドを使用して、変更可能なコピーを推測できます。文字列を変更しないNSStringメソッドもたくさんありますが、特定の変更が加えられた新しい文字列を得ることができます(たとえば、stringByAppendingString:)。あなたはそれらとかなり長い道を行くことができます。