从NSUserDefaults检索NSInteger时出现问题

时间:2013-01-09 11:41:09

标签: ios cocoa nsuserdefaults nsinteger

我在保存时遇到问题&从NSUserDefaults检索int。我使用以下代码保存到NSUserDefaults:

int globalRank = 1;
NSUserDefaults *submissionDefaults = [NSUserDefaults standardUserDefaults];
[submissionDefaults setInteger: globalRank forKey:@"globalRankIntForLT"];
NSLog(@"updating %@ as the globalRank in NSUserDefaults",globalRank);
[submissionDefaults synchronize];

这似乎可以正常工作。在我的输出中,我可以看到:

"updating 1 as the globalRank in NSUserDefaults"

当我使用以下代码检索号码时:

NSUserDefaults *submissionDefaults = [NSUserDefaults standardUserDefaults];
NSInteger *currentGlobalRank = [submissionDefaults integerForKey:@"globalRankIntForLT"];
int currentGlobalRankInt = currentGlobalRank;
NSLog(@"Retrieved skip int is: %d as nsinteger is: %d",currentGlobalRankInt, currentGlobalRank);

I get output:
"Retrieved skip int is: 4978484032 as nsinteger is: 4978484032"

我稍后将此int传递给另一个返回错误的方法,因为4978484032比预期的要大。

NSUserDefaults包含一个NSInteger,但即使在那时它也不正确。我究竟做错了什么?谢谢,詹姆斯

4 个答案:

答案 0 :(得分:1)

NSInteger是原始类型,而不是对象。它应该是NSInteger currentGlobalRank而不是NSInteger *currentGlobalRank。 您可以在代码中使用NSInteger代替int。无需将NSInteger转换为int

在iOS上,NSInteger定义为int,在OS X上定义为long

答案 1 :(得分:1)

您正在设置一个整数并尝试将POINTER检索为整数。变化:

NSInteger *currentGlobalRank = [submissionDefaults integerForKey:@"globalRankIntForLT"];

为:

NSInteger currentGlobalRank = [submissionDefaults integerForKey:@"globalRankIntForLT"];

尽管NSInteger从NS开始,它不是NSObject的子类,但它只是原始的

答案 2 :(得分:0)

更改此代码......

NSInteger *currentGlobalRank = [submissionDefaults integerForKey:@"globalRankIntForLT"];
int currentGlobalRankInt = currentGlobalRank;
NSLog(@"Retrieved skip int is: %d as nsinteger is: %d",currentGlobalRankInt, currentGlobalRank);

为...

NSInteger *currentGlobalRank = [submissionDefaults integerForKey:@"globalRankIntForLT"];
int currentGlobalRankInt = [currentGlobalRank intValue];
NSLog(@"Retrieved skip int is: %d as nsinteger is: %@",currentGlobalRankInt, currentGlobalRank);

答案 3 :(得分:0)

使用NSInteger或类似NSNumber的包装类而不是int

你错误地将 * 放在 NSInteger * currentGlobalRank

NSInteger globalRank = 1;
NSUserDefaults *submissionDefaults = [NSUserDefaults standardUserDefaults];
[submissionDefaults setInteger: globalRank forKey:@"globalRankIntForLT"];
NSLog(@"updating %@ as the globalRank in NSUserDefaults",globalRank);
[submissionDefaults synchronize];



NSUserDefaults *submissionDefaults = [NSUserDefaults standardUserDefaults];
NSInteger currentGlobalRank = [submissionDefaults integerForKey:@"globalRankIntForLT"];
NSLog(@"Retrieved skip int is: %d as nsinteger is: %d",currentGlobalRank, currentGlobalRank);