LoginSignup
4
5

More than 5 years have passed since last update.

NSArray/NSMutableArrayへのアクセス時に落ちてた話

Last updated at Posted at 2013-01-20

単に「ちゃんと型合わせとけ」ってだけの話なのですが。。。 練習ついでにメモ。

あるときからデバッグメッセージこんなのが出て落ちるようになった。

-[__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”];

デバッグ中のシミュレータからアプリを一旦全削除後、再度デバッグでインストールされた後から出ていた様子。
アプリが初期化されたため、改めて初期値が設定された際に顕在化したようで。
→デバッグビルドしたアプリを一旦削除して、インストール直後からの動作確認も忘れずやること(特に初期値の設定とか変えた場合)

それ以前にセーブ・ロードする型を合わせとけ。と。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5