[Cocoa] NSMutableArrayのインスタンスを”Mutable”なまま複製したいときは”mutableCopy”メソッドを使おう

photo credit: alberthuynhphoto
iPadアプリの開発をしていて少しハマってしまったのでメモ。
最近よくハマるので、どんどんブログ記事にしてまとめていきたいと思います。
問題
NSMutableArrayのインスタンス(つまり変更可能な配列)を複製して、複製先の配列にオブジェクトを挿入しようとしたときのことです。
下記のようなコードを実行すると途中で例外が発生し、プログラムが停止してしまいました。
NSMutableArray* originalArray; NSMutableArray* duplicatedArray; originalArray = [[NSMutableArray alloc] init]; duplicatedArray = [originalArray copy]; [duplicatedArray addObject:@"str"]; // NSInvalidArgumentException
具体的には、最後の行で「duplicatedArrayにはaddObjectなんていうメソッドは存在しないよ」と怒られてしまいます。
duplicatedArrayはNSMutableArrayクラスのインスタンスとして宣言しているはずなのに・・。
どうしてでしょうか?
原因・解決
どうやら、copyメソッドを呼び出してNSMutableArrayクラスのインスタンスを複製しようとした場合、生成されるのはNSArrayクラスのインスタンスになってしまうみたいです。
NSArrayクラスは変更不可能な配列であり、addObjectメソッドは宣言されていないため、先程のような例外が発生してしまいます。
色々調べたところ、NSMutableArrayクラスのインスタンスを”Mutable(変更可能)な状態のまま複製するためには、どうやらcopyメソッドではなくmutableCopyメソッドを使えばいいみたいです。
早速先ほどのコードを以下のように修正してみます。
すると、無事に配列にオブジェクトが追加できることを確認できました。
NSMutableArray* originalArray; NSMutableArray* duplicatedArray; originalArray = [[NSMutableArray alloc] init]; duplicatedArray = [originalArray mutableCopy]; // copy から mutableCopyに変更 [duplicatedArray addObject:@"str"]; // 無事配列にオブジェクトを追加できた。
まとめ
結構些細なことが原因なのに、小一時間このことについて悩まされてしまいました。
ちゃんとリファレンスにしっかり目を通しておかなきゃいけないな、と再確認させられた僕なのでした。。
それでは!






