NSMutableStringをNSStringに変換する方法【Objective-C】

コンストラクタ呼び出しを用いる方法が知られていますが、オススメは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"

広告