--
--/--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2011
12/24

「__NSArrayM」と「__NSArrayI」

iPhone開発


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

NAME
TITLE
MAIL
URL
PASS (削除時に必要)
SECRET 管理者にだけ表示を許可する
COMMENT&
DECORATION

TB

トラックバック

http://sonsofbasil.blog55.fc2.com/tb.php/22-17c6d13a

この記事にトラックバックする(FC2ブログユーザー)

プロフィール

Taku Sasahara

Author:Taku Sasahara
Hello world!!

バジルの息子。
法学部法律学科卒。
バリバリの文系プログラマです。
ペーペーです。

Facebook

My faborite books
僕のお気に入り書籍の本棚

最新トラックバック

スポンサーリンク

検索フォーム

ブロとも申請フォーム

QRコード
QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。