コンストラクタ呼び出しを用いる方法が知られていますが、オススメはcopyメソッドの使用です。
コンストラクタ
まずはNSString型のコンストラクタを用いる方法です。
NSMutableString *ms = [NSMutableString stringWithString:@"a"];
NSString *str = [NSString stringWithString:ms]; // コピーされる
[ms appendString:@"b"];
NSLog(@"%@, %@", ms, str); // "ab a"
copyメソッド
NSMutableString#copy
メソッドの戻り値はイミュータブルなNSStringですので安心してください。
NSMutableString *ms = [NSMutableString stringWithString:@"a"];
NSString *str = ms.copy; // コピーされる
[ms appendString:@"b"];
NSLog(@"%@, %@", ms, str); // "ab a"
キャスト演算子
キャスト演算子を用いた方法は若干危険です。
NSMutableString *ms = [NSMutableString stringWithString:@"a"];
NSString *str = (NSString *)ms; // コピーされない
[ms appendString:@"b"];
NSLog(@"%@, %@", ms, str); // "ab ab" (同じ値になってしまう)
ポインタ変数のキャストはコピーではなく、単なる型変換となりますので注意してください。ms
変数とstr
変数の参照先は同じものです。元のms
オブジェクトを操作するとstr
オブジェクトの結果も同様に変化します。
NSMutableStringをコピーする方法
NSMutableStringの純粋なコピーを行いたい場合には、NSMutableString#mutableCopy
メソッドでミュータブルなNSMutableStringのコピーを取得することができます。
NSMutableString *ms = [NSMutableString stringWithString:@"a"];
NSMutableString *msCopy = ms.mutableCopy;
[msCopy appendString:@"b"];
NSLog(@"%@", ms); // "a"
NSLog(@"%@", msCopy); // "ab"