【问题标题】:App is crashing on NSUserDefaults setObject:forKey:应用程序在 NSUserDefaults setObject:forKey 上崩溃:
【发布时间】:2025-12-07 23:05:02
【问题描述】:

在将对象设置为 NSUserDefaults 时,我的应用在 iOS 12 中随机崩溃。以下是我发生崩溃的代码

shared2 = [[NSUserDefaults alloc]initWithSuiteName:@"group.AppName"];

NSData *datashare = [NSKeyedArchiver archivedDataWithRootObject:_sharedData];

[shared2 setObject:datashare forKey:@"dicForToday"];

没有得到任何崩溃日志,因为它是随机发生的

这种崩溃的频率在 iOS 12 上要高得多。

【问题讨论】:

  • 是什么让你认为这是崩溃的代码?看起来像是网络错误(请参阅对 CFNetwork 的引用)。
  • @Stephen Darlington,我确定这次崩溃与网络问题无关,该日志是用于其他内容的,我还编辑了问题。

标签: objective-c nsuserdefaults nsnotificationcenter ios12


【解决方案1】:

通常您可以使用此方法保存数据 发帖方式:

 [[NSUserDefaults standardUserDefaults] setObject:object forKey:@"somename"];

获取方法:

NSMutableDictionary *dicCover = [[NSUserDefaults standardUserDefaults] valueForKey:@"somename"];

有时,字典或数组或格式不正确,我们可以使用这样的方式来获取您的数据以使用NSUserdefault 使用成就:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arrayUsers];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"somename"];

获取:

NSData *usersData = [[NSUserDefaults standardUserDefaults] valueForKey:@"somename"];
    NSMutableArray *redirectionDic = [NSKeyedUnarchiver unarchiveObjectWithData:usersData];

【讨论】:

  • Don't use -[NSUserDefaults synchronize] From Apple's docs..."这种方法是不必要的,不应该使用。"
  • …在 iOS 12 及更高版本中,它是无操作的。为了向后兼容,您仍然需要在 iOS 11 及更低版本中调用它,因此如果您的目标不是最新版本,保留它并没有什么坏处。
  • @Developer1205,我正在做与您在问题中看到的相同的事情。
【解决方案2】:
  NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
                                  initWithSuiteName:keyChainGroup];
    [myDefaults setObject:userInfo forKey:key];

试试这个

【讨论】:

  • 我通过将自定义类对象归档到 NSData 中来将自定义对象存储在 userDefaults 中。所以,我们确实需要它。
  • 在我的情况下,我将 JSON 对象存储在我的钥匙串组中,例如 NSArray* userInfo = [command.arguments objectAtIndex:2]; NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:keyChainGroup]; [myDefaults setObject:userInfo forKey:key];