【问题标题】:NSUserDefaults standardUserDefaults setObject crash in defaultsChangedNSUserDefaults standardUserDefaults setObject 在 defaultsChanged 中崩溃
【发布时间】:2012-01-14 03:38:12
【问题描述】:

我遇到了一些我不明白的事情。我在手机的设置菜单中为应用程序设置了语言选择。我有委托方法

- (void)defaultsChanged:(NSNotification *)notif 

在我的 AppDelegate 中。我阅读了所选语言的新参数并尝试更改语言

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];

不幸的是,这条线总是给我一个 EXC_BAD_ACCESS 错误。我不明白为什么。

我尝试了 StackOverflow 上给出的不同方法来在运行时更改本地化,但它们仅适用于应用程序中的文本。我也有本地化的图像,它们仅在 NSUserDefaults 中更改语言时更新。

我需要一些建议。

谢谢!

【问题讨论】:

  • 你能添加你的堆栈跟踪/控制台日志吗?
  • 你启用zombies
  • @deanWombourne 实际上控制台上什么都没有,也没有堆栈跟踪
  • @rckoenes 我不知道什么是僵尸(除了......好吧......电视),我不知道如何启用它们。
  • 我想我知道发生了什么。 (void)defaultsChanged:(NSNotification *)notif 的 NSNotification* 是 NSUserDefaultsDidChangeNotification。调用 [[NSUserDefaults standardUserDefaults] setObject:obj forKey:key] 然后会触发 defaultsChanged... 然后我们有一个循环和一个...好吧... stackoverflow :) 你们觉得呢?

标签: iphone localization nsuserdefaults exc-bad-access


【解决方案1】:

在我看来,在 defaultsChanged 处理程序中对 NSUserDefaults 进行更改并不是一个好主意。根据您自己的评论,它会导致递归。

如果您确实需要更改 defaultsChanged 中的 NSUserDefaults,解决方法是添加一个布尔标志,表示您正在进行更改,以便在被调用时知道不做任何事情以响应您自己的更改。

也许您需要一种不同于 NSUserDefaults 的存储方法来存储您的状态,例如 plist。我知道 NSUserDefaults 使用起来真的很方便,这就是人们将它用于(有时滥用)它来处理实际上不是用户偏好的各种状态的主要原因,但它可能会由于所有的花里胡哨而导致问题自带,比如支持NSUserDefaultsDidChangeNotification观察者。

【讨论】:

  • 感谢您提供更多信息。即使使用布尔标志解决方法,这也不能解决我的问题。甚至有没有办法在运行时在本地化文件(如我的案例的图像)之间切换?同样,这里给出的不同 LocalizedStrings 之间切换的解决方案就像一个魅力。但它不会采用正确的本地化图像。我很确定必须重新启动应用程序才能使其生效。
  • 你的意思是它仍然崩溃吗?
  • 我认为即时更改本地化图像的语言是一个完全不同的问题。如果您能够成功地处理字符串,我想您可以对图像使用相同的方法。您可以尝试发布一个问题,解释您如何使用一些代码处理字符串,并询问如何将其扩展到图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多