NSUserDefaults standardUserDefaults返回nil

时间:2011-11-05 22:24:32

标签: iphone objective-c cocoa-touch nsuserdefaults synchronize

我已经看到了几个关于此的问题,但我不认为这些问题可以回答我的问题。

在我的方法中,我有一个if语句,我用它在我的应用程序首次启动时设置默认值。

NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
[myDefaults setObject:@"1" forKey:kNSUAccountSelection];
[myDefaults synchronize];

再向下,我用另一把钥匙做同样的事。

然后我跑了......

NSString *account_name = [[accountArray objectAtIndex:[accountArray 
   indexOfObject:[[NSUserDefaults standardUserDefaults] 
   objectForKey:kNSUAccountSelection]]] objectForKey:@"Account_Name"];

导致错误。

由于未捕获的异常'NSRangeException'而终止应用程序,原因:' - [NSMutableArray objectAtIndex:]:索引2147483647超出边界[0 .. 0]'

所以我在那条线之前直接尝试......

NSUserDefaults *myDefaults2 = [NSUserDefaults standardUserDefaults];
NSString *str = [myDefaults2 stringForKey:kNSUAccountSelection];

str返回nil。

在我的constants.h文件中,我有......

#define kNSUAccountSelection @"accountselection"

是的,accountArray是从我的数据库中填充的,并且有值。

我不明白为什么我会得到零,我必须做些什么来解决这个问题? 据我所知,这应该有用。

3 个答案:

答案 0 :(得分:0)

您确定您正在运行的“if”语句是否正在发生? 错误会响应你的数组,所以也许告诉我们那里发生了什么?

答案 1 :(得分:0)

尝试更改此行:

NSString *str = [myDefaults2 stringForKey:kNSUAccountSelection];

到此:

NSString *str = [myDefaults2 objectForKey:kNSUAccountSelection];

此外,硬编码@" 1"在你的objectForKey中:@" Account_Name"声明,以确保它应按预期返回。

答案 2 :(得分:0)

我建议稍稍打破你的1-liner。

NSString *account_name = [[accountArray objectAtIndex:[accountArray 
   indexOfObject:[[NSUserDefaults standardUserDefaults] 
   objectForKey:kNSUAccountSelection]]] objectForKey:@"Account_Name"];

具体地

[accountArray 
       indexOfObject:[[NSUserDefaults standardUserDefaults] 
       objectForKey:kNSUAccountSelection]]

导致您的错误。

indexOfObject返回NSNotFound

NSNotFound 2147483647

修改

你的评论让我很困惑。我们来电话

int index = [accountArray 
           indexOfObject:[[NSUserDefaults standardUserDefaults] 
           objectForKey:kNSUAccountSelection]];

我引用的1-liner现在是

NSString *account_name = [[accountArray objectAtIndex:index] objectForKey:@"Account_Name"];

您的评论参考

int num = [[accountArray objectAtIndex:[accountArray indexOfObject:[[NSUserDefaults standardUserDefaults] objectForKey:kNSUAccountSelection]]] intValue];

变为

int num = [[accountArray objectAtIndex:index] intValue];

accountArray里面应该是什么?字典,字符串或数字?我知道你可以在数组中混合和匹配你想要的任何对象,但是你期待什么

[accountArray objectAtIndex:index]

是吗?