NSUserDefaults:倾倒NSUserDefaults的standardUserDefaults结构

时间:2009-04-30 23:41:20

标签: objective-c cocoa-touch

有没有人知道通过NSLog转储NSUserDefaults的standardUserDefaults的快速方法?这就是我所拥有的:

NSLog(@"NSUserDefaults dump: %@", [NSUserDefaults standardUserDefaults]);

但它返回:

NSUserDefaults dump: <NSUserDefaults: 0x50b520>

......这不是我想要的。我真的很想拥有键值对。

非常感谢任何帮助或正确方向的观点。干杯!

6 个答案:

答案 0 :(得分:37)

NSLog(@"NSUserDefaults dump: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

答案 1 :(得分:18)

感谢我的商业伙伴和朋友Don McCaughey为我修改代码并提供简明的答案。要与其他人分享这里是一段代码:

  NSDictionary *bundleInfo = [[NSBundle mainBundle] infoDictionary];
  NSString *bundleId = [bundleInfo objectForKey: @"CFBundleIdentifier"];

  NSUserDefaults *appUserDefaults = [[NSUserDefaults alloc] init];
  NSLog(@"Start dumping userDefaults for %@", bundleId);
  NSLog(@"userDefaults dump: %@", [appUserDefaults persistentDomainForName: bundleId]);
  NSLog(@"Finished dumping userDefaults for %@", bundleId);
  [appUserDefaults release];

正如您所看到的,每个回答问题的人都在正确的轨道上,但没有提供任何代码的解决方案 - 直到Don在源代码管理中编辑我们的代码。谢谢大家!

答案 2 :(得分:10)

尝试:

NSLog(@"NSUserDefaults dump: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

dictionaryRepresentation返回默认值的NSDictionary表示。

答案 3 :(得分:8)

NSLog(@"%@ defaults = %@", [self class], 
  [[NSUserDefaults standardUserDefaults] 
   persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]);

答案 4 :(得分:6)

默认情况下,共享的NSUserDefaults初始化为三个搜索域(如果需要,还可以添加其他搜索域):app参数,app首选项(存储在应用程序plist中的内容)和本地化系统首选项。最后一个是为什么你会看到那些不熟悉的Apple键,但你真的不必担心“覆盖”它们。如果您使用相同的密钥名称,它只会将该值放在应用程序首选项域中。在系统首选项之前搜索您应用的首选项,这样您就可以获得相同的值,但不会影响其他任何值。

如果您确实只想要应用程序的首选项,则可以删除其他搜索域(您需要的特定名称位于文档中)。

答案 5 :(得分:1)

这是一个方便的类,你可以用它来转储所有类型的垃圾:

https://github.com/VTPG/CommonCode/blob/master/VTPG_Common.h

要使用它,请将标题添加到“m”

#import "VTPG_Common.h"

然后在你的类中的任何地方调用LOG_EXPR(foo):

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] init];
[userDefaults addSuiteNamed:@"com.apple.spaces"];
NSDictionary *foo = [userDefaults dictionaryForKey:@"SpacesDisplayConfiguration"];
LOG_EXPR(foo);