« 【東北関東大震災】有益と思われる情報まとめ | トップページ | テーブルのセルが削除できない件。 »

2011年3月20日 (日)

mutating method sent to immutable object

mutating method sent to immutable object と戦う。

変更できないオブジェクトを変更しようとしているよと、解釈。

怪しいのはグローバル変数(objectibe-cでは何ていうのか忘れた)の配列。

ユーザデフォルトに格納した変更可能な配列を、新たに作成した変更可能な配列に入れる。
その後、新たに作成した変更可能な配列へデータを追加、またはデータを削除しようとすると落ちる。(エラー文はmutating method sent to immutable object)

はてさて。どうしてだろう。

...1時間後

コピーすると回避できた。

下記 viewdidload
//配列に入れるテスト用辞書3つ
NSDictionary *test01 = [NSDictionary dictionary];
test01 = [NSDictionary dictionaryWithObjectsAndKeys:@"test01_01", @"key1", @"test01_02", @"key2", nil];

NSDictionary *test02 = [NSDictionary dictionary];
test02 = [NSDictionary dictionaryWithObjectsAndKeys:@"test02_01", @"key1", @"test02_02", @"key2", nil];

NSDictionary *test03 = [NSDictionary dictionary];
test03 = [NSDictionary dictionaryWithObjectsAndKeys:@"test03_01", @"key1", @"test03_02", @"key2", nil];


//変更可能な配列に辞書を追加
NSMutableArray *marray2 = [[NSMutableArray array]init];
[marray2 addObject:test01];
[marray2 addObject:test02];
[marray2 addObject:test03];

//ユーザデフォルトを取得
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:marray2 forKey:@"test"];

---
下記、ボタンを押したら辞書の中のデータを削除するメソッド
//ユーザデフォルトを取得
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

NSMutableArray *marray2 = [defaults objectForKey:@"test"];

NSMutableArray *marraycopy = [NSMutableArray arrayWithArray:marray2];
[marraycopy removeObjectAtIndex:1];
NSLog(@"marraycopy = %@", marraycopy);

---
注目すべきは削除するメソッド。

NSMutableArray *marray2 = [defaults objectForKey:@"test"];

ここでユーザデフォルトから配列を取得。
しかし、この配列に変更を加えるとエラーがでる。
よって、コピーする。

NSMutableArray *marraycopy = [NSMutableArray arrayWithArray:marray2];

そしてすかさず、削除。

[marraycopy removeObjectAtIndex:1];

これで解決した。
っていうか、回避方法が分かっただけでどうして、コピー前の情報に変更を加えるとエラーが出るのか分からない。

« 【東北関東大震災】有益と思われる情報まとめ | トップページ | テーブルのセルが削除できない件。 »

iPhone開発」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1424160/39299440

この記事へのトラックバック一覧です: mutating method sent to immutable object:

« 【東北関東大震災】有益と思われる情報まとめ | トップページ | テーブルのセルが削除できない件。 »