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上).
编辑
\n\n简短版本:只需延迟错误触发调用,直到用户不烦恼为止。
\n\n长版:
\n\n因为我认为问题来自于调用,所以在请求键盘布局的某些操作(例如)之后[NSUserDefaults standardUserDefaults]会触发肮脏的 plist 加载循环...UIAlert
我建议[NSUserDefaults standardUserDefaults]在应用程序加载时仅调用一次(在任何导致错误的调用之前),并在整个应用程序生命周期中将返回的引用保留在单例类中。我不认为内存占用会很大......(我在几个应用程序中这样做,没有任何问题)。最糟糕的是,plist load*100 仅在应用程序加载时执行一次,而不是在游戏期间执行。
如果问题来自[userDefaults setXxxx:...]调用,同样的解决方法,您可以将值保存在内存中,并稍后在 中设置它们userDefaults,就像在同步它们之前一样……但是,如果出现任何问题(例如崩溃),则存在丢失信息的风险。我个人更喜欢sync在每次之后set确保数据完整性......
恩多菲迪特
\n\n简短的回答:iOS4.3 bug,找到解决方法的机会很少... bugreport 并等待下一次 iOS 更新... 2 周后的 WWDC... 1~2 个月。
\n\n长的一个:
\n\n查看 UIKit 组件后,以下是我的猜测:
\n\nInputModeProperties.plist包含按区域设置排列的所有键盘布局的列表。UIKit将其用于多种用途,例如在显示键盘时确定可用的键盘布局。(语言环境...)有一点很有趣,我们可以在以下位置找到它的一些信息NSUserDefaults:
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...\nRun Code Online (Sandbox Code Playgroud)NSGlobalDomain,或更可能的是每个用户\xe2\x80\x99s 首选语言的单独域)当没有键盘可用时NSUserDefaults...(就像同步后,让我们想象一个错误这样做)...UIKit可以尝试所有可用的键盘来确定用户一,肮脏地解析这个 4.4K plist 一百次...就像当同步/更改UIAlertView后显示...。NSUSerDefault
谁知道?拥有源代码的苹果人:)
\n\n我不会感到惊讶的是,将首选项设置为默认美国以外的键盘,然后恢复为美国将解决该问题。对你的情况没用,但可以确认问题。看到另一个 4.3 错误...
\n\n正如其他人所说,不使用 NSUserDefaults 而是使用 /Documents 中的简单自定义 plist 可能是一个(in)不错的解决方法。
\n\n《小翅膀》的作品非常棒!:)
\n| 归档时间: |
|
| 查看次数: |
651 次 |
| 最近记录: |