LoginSignup
5
6

More than 5 years have passed since last update.

UserDefaultsから取り出したNSMutableArrayにオブジェクトをセットしたらエラー

Posted at

バックグラウンドフェッチの動作確認をしていて、
バックグラウンドフェッチが動作したら、そのときの時間をNSMutableArrayオブジェクトに入れ、ユーザーデフォルトにセットするということをしていました。
↓こんな感じです。

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    NSMutableArray *array = [ud objectForKey:@"log"];
    if (!array) {
        array = [NSMutableArray array];
    }
    [array addObject:[NSDate date]];
    [ud setObject:array forKey:@"log"];
    [ud synchronize];
            completionHandler(UIBackgroundFetchResultNewData);

}

エミュレータでデバッグしていると
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
とNSArrayにインサートしようとしていると怒られます。

そんな記述はないので、若干はまりました。

その結果、わかったのは
「UserDefaultsにmutableなオブジェクトをセットしようとするとimmutableなオブジェクトにされて保存される。」
ということ。

下記のようにユーザーデフォルトから取り出した後、mutableCopyして解決しました。
```
(修正前)
NSMutableArray *array = [ud objectForKey:@"log"];

(修正後)
NSMutableArray *array = [[ud objectForKey:@"log"] mutableCopy];
```

5
6
1

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
5
6