我实现了一些公共功能,可以让我的程序更简洁。但是我的模拟器上有问题,但它在设备上很好。 我100%确定我存储在UserDefaults中的uid是NSNumber。但为什么它只会在模拟器上崩溃?
代码:
+(NSString *) keyForUserProfileName{
NSNumber *uid = [[NSUserDefaults standardUserDefaults] objectForKey:@"uid"];
NSLog(@"my uid is %@", uid);
NSString *key = [@"UserProfileNameFor" stringByAppendingString: [uid stringValue]];
NSLog(@"my key is %@", key);
return key;
}
错误:
my uid is 11803624
-[NSTaggedPointerString stringValue]: unrecognized selector sent to instance 0xa0079ea9d7eca1c8
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString stringValue]: unrecognized selector sent to instance 0xa0079ea9d7eca1c8'
uid指定代码:
NSNumber *uid = [loginResult objectForKey:@"uid"];
[prefs setObject:uid forKey:@"uid"];
修改 --------------------------------------- --------------------------------
在NSNumber *uid...
行之后插入这两行后,程序将通过模拟器和设备。但我完全不知道为什么会出错。
int uidint = [uid intValue];
NSString *uidString = [@(uidint) stringValue];
答案 0 :(得分:1)
将您的uid分配代码更改为
NSNumber *uid = [NSNumber numberWithInteger:[[loginResult objectForKey:@"uid"] integerValue]];
答案 1 :(得分:0)
当您将uid's
类型放入NSUserDefaults
时,该类型应与类型一致。当您编写OC时,XCode在运行时之前不知道uid's
类型是否为NSNumber
。
因此,请更改类似NSString *uid = [[NSUserDefaults standardUserDefaults] objectForKey:@"uid"];
的类型(如果您将NSString uid
放入NSUserDefaults
)并尝试。
---------------------------------更新------------- -----------------
一个棘手的方法是,从uid
获得NSUserDefaults
后,您可以检查uid
的类型,然后根据需要更改类型。
答案 2 :(得分:0)
确保您的UserDefaults
包含NSNumber object
作为uid
的值,并且它不是字符串或整数等。我的意思是您应该将您的数字设置为,
NSNumber *number = yournumber here ;
[[NSUserDefaults standardUserDefaults] setObject:number forKey:@"uid"];
如果您正在设置字符串对象,则无需再次将其转换为字符串!
答案 3 :(得分:0)
我认为您没有设置uid
的值,一旦设置完毕就可以检索,请查看以下代码供您参考。
+(NSString *) keyForUserProfileName{
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:10] forKey:@"uid"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSNumber *uid = [[NSUserDefaults standardUserDefaults] objectForKey:@"uid"];
NSString *key = [@"UserProfileNameFor : " stringByAppendingString: [uid stringValue]];
return key;
}