バックグラウンドフェッチの動作確認をしていて、
バックグラウンドフェッチが動作したら、そのときの時間を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];
```