2011
12/24
「__NSArrayM」と「__NSArrayI」
iOSアプリ開発のデバッグ中に発生したエラー。
【エラーログ】
2011-12-24 02:56:27.607 MutableArrayCopyTest[9503:207] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x6a296c0
【現象】
NSMutableArrayのオブジェクトをcopyしたオブジェクトに "addObject:"、"replaceObjectAtIndex:withObject"、"removeObject:" 等の配列内要素の構成を変更する処理をコールすると強制終了する。
【原因】
NSMutableArray のAというオブジェクトを copy したBという NSMutableArray のオブジェクトは実は Mutable ではなく Immutable なオブジェクトになっている。
NSMutableArray として宣言したBオブジェクトは copy された段階で Immutable となるんです。
これが判明した理由はこれ。
「__NSArrayM」と「__NSArrayI」。
__NSArrayM の M は Mutable (変更可能)の M。
__NSArrayI の I は Immutable (変更不可能)の I。
恥ずかしながら今回初めて知りました。
【解決方法】
どうしても copy したい場合は以下のように copy を変更すればいいと思います。
@implementation TestView
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSMutableArray *firstArray =
[[NSMutableArray alloc] initWithObjects:@"test1", @"test2", nil];
// NSMutableArray *secondArray = [firstArray copy];
NSMutableArray *secondArray = [firstArray mutableCopy];
[secondArray addObject:@"test3"];
}
return self;
}
@end
そのままですね。
mutableCopy です。
NSMutableArray で addObject ができないなんて悩んでる方は上記の理由が原因かもしれませんね。
CM
TB
プロフィール
Author:Taku Sasahara
Hello world!!
バジルの息子。
法学部法律学科卒。
バリバリの文系プログラマです。
ペーペーです。
Facebook
My faborite books
僕のお気に入り書籍の本棚
最新トラックバック
Support
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード




