对"InputModeProperties.plist"的数百次访问落后于我的游戏(iPhone)

And*_*ger 22 objective-c nsuserdefaults uikit property-list ios

我有一个奇怪的问题与Tiny Wings的错误修正.在我的游戏中我使用的东西如下:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];      
[userDefaults setFloat:musicVolume forKey:@"musicVolume"];
Run Code Online (Sandbox Code Playgroud)

用于保存一些首选项和高分表.在游戏结束时,当游戏画面出现时,游戏将高分保存到standardUserDefaults.它运行良好,直到游戏显示如下的UIAlertView:

UIAlertView *alert = [[UIAlertView alloc] init];
[alert setTitle:@"Get ready!"];
[alert setDelegate:self];
[alert addButtonWithTitle:@"Ok"];
[alert show];
[alert release];
Run Code Online (Sandbox Code Playgroud)

之后,AlertView消失每次游戏保存财产以后一会儿游戏滞后(在几秒钟一些设备)的standardUserDefaults.在游戏使用UITextField输入玩家名称后也会发生这种情况.在使用两个UIKit Elements中的一个之前游戏中没有任何延迟,但在使用它们之后游戏会延迟直到我重新启动应用程序.我用性能工具分析了这个问题,"I/O活动"仪器显示有数百个"开放 - 读取 - 关闭"访问

/System/Library/Frameworks/UIKit.framework/InputModeProperties.plist
Run Code Online (Sandbox Code Playgroud)

这导致了滞后.

我完全不知道该怎么做.有任何想法吗?

编辑:
苹果开发者论坛http://devforums.apple.com/message/424374#424374中有一个帖子,其中有人有同等的问题,似乎它只出现在iOS 4.3中.我已经测试了它,而且仅在我的4.3设备上发生了滞后(不是在3.1 iPod Touch和4.2 iPad上).

Vin*_*rci 3

编辑

\n\n

一个不错的错误解决方法:

\n\n

简短版本:只需延迟错误触发调用,直到用户不烦恼为止。

\n\n

长版:

\n\n

因为我认为问题来自于调用,所以请求键盘布局的某些操作(例如)之后[NSUserDefaults standardUserDefaults]会触发肮脏的 plist 加载循环...UIAlert

\n\n

我建议[NSUserDefaults standardUserDefaults]在应用程序加载时仅调用一次任何导致错误的调用之前),并在整个应用程序生命周期中将返回的引用保留在单例类中。我不认为内存占用会很大......(我在几个应用程序中这样做,没有任何问题)。最糟糕的是,plist load*100 仅在应用程序加载时执行一次,而不是在游戏期间执行。

\n\n

如果问题来自[userDefaults setXxxx:...]调用,同样的解决方法,您可以将值保存在内存中,并稍后在 中设置它们userDefaults,就像在同步它们之前一样……但是,如果出现任何问题(例如崩溃),则存在丢失信息的风险。我个人更喜欢sync在每次之后set确保数据完整性......

\n\n

恩多菲迪特

\n\n
\n\n

简短的回答:iOS4.3 bug,找到解决方法的机会很少... bugreport 并等待下一次 iOS 更新... 2 周后的 WWDC... 1~2 个月。

\n\n

长的一个:

\n\n

查看 UIKit 组件后,以下是我的猜测:

\n\n
    \n
  • InputModeProperties.plist包含按区域设置排列的所有键盘布局的列表。
  • \n
  • UIKit将其用于多种用途,例如在显示键盘时确定可用的键盘布局。(语言环境...)
  • \n
  • 有一点很有趣,我们可以在以下位置找到它的一些信息NSUserDefaults

    \n\n
    NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);\n==> {\nAppleKeyboards =     (          // I have two keyboard in preferences\n   "fr_FR@hw=French;sw=AZERTY", // french  first\n   "en_US@hw=US;sw=QWERTY"      // english second\n);\n...\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 但与您的分数不同,这些信息不会存储在应用程序首选项中。(NSGlobalDomain,或更可能的是每个用户\xe2\x80\x99s 首选语言的单独域
  • \n
  • 因此,我不会对 UIKit + NSUserDefaults 中存在冲突(错误)导致脏 plist 加载循环感到惊讶。
  • \n
  • 你说100左右打电话?这类似于 plist 中的语言环境/布局的数量!
  • \n
\n\n

当没有键盘可用时NSUserDefaults...(就像同步后,让我们想象一个错误这样做)...UIKit可以尝试所有可用的键盘来确定用户一,肮脏地解析这个 4.4K plist 一百次...就像当同步/更改UIAlertView后显示...。NSUSerDefault

\n\n

谁知道?拥有源代码的苹果人:)

\n\n

我不会感到惊讶的是,将首选项设置为默认美国以外的键盘,然后恢复为美国将解决该问题。对你的情况没用,但可以确认问题。看到另一个 4.3 错误...

\n\n

正如其他人所说,不使用 NSUserDefaults 而是使用 /Documents 中的简单自定义 plist 可能是一个(in)不错的解决方法。

\n\n

《小翅膀》的作品非常棒!:)

\n