単に「ちゃんと型合わせとけ」ってだけの話なのですが。。。 練習ついでにメモ。
あるときからデバッグメッセージこんなのが出て落ちるようになった。
-[__NSArrayI removeAllObjects]: unrecognized selector sent to instance 0x********
// 起動時に保存された値ロード
NSMutableArray *mutableArray = [NSKeyedUnarchiverunarchiveObjectWithData: [defaults dataForKey:@“hoge”]];
// (中略)
// 不要になった際に前削除する
[mutableArray removeAllObjects];
NSUserDefaultから取得するNSMutableArrayへのアクセス時。
アプリ起動後最初にアクセスするのが上記、全削除の部分。ここで落ちる。
データのセーブ・ロードとも問題無く、特にコード自体いじってない状態で突然出始めるようになったため、1〜2時間悩む。
結果、原因はNSUserDefaultに初期値設定している以下のコード。
NSMutableDictionary *initialData = [NSMutableDictionary dictionary];
[initialData setObject:[NSKeyedArchiver archivedDataWithRootObject:[NSArray array]] forKey:@"hoge”];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:initialData];
“NSArray"で初期値設定してしまっていたのが原因。
正解は以下。
[initialData setObject:[NSKeyedArchiver archivedDataWithRootObject:[NSMutableArray array]] forKey:@"hoge”];
デバッグ中のシミュレータからアプリを一旦全削除後、再度デバッグでインストールされた後から出ていた様子。
アプリが初期化されたため、改めて初期値が設定された際に顕在化したようで。
→デバッグビルドしたアプリを一旦削除して、インストール直後からの動作確認も忘れずやること(特に初期値の設定とか変えた場合)
それ以前にセーブ・ロードする型を合わせとけ。と。