在模拟器上崩溃但在设备上不崩溃:-[NSTaggedPointerString stringValue]:发送到实例的无法识别的选择器

Crashes on Simulator but not on devices: -[NSTaggedPointerString stringValue]: unrecognized selector sent to instance

我实现了一些public功能,可以让我的程序更简洁。但是我的模拟器有问题,但它在设备上很好。 我 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];

你的uid's类型要和你放入NSUserDefaults时的类型一致。写OC的时候,XCode直到运行时才知道uid's类型是不是NSNumber。 所以像这样改变类型NSString *uid = [[NSUserDefaults standardUserDefaults] objectForKey:@"uid"];(如果你把一个NSString uid变成NSUserDefaults)然后试一试。

--------------------------------更新------------ ------------------

一个tricky的方法是当你从NSUserDefaults得到uid后,你可以检查uid的类型,然后根据你的需要改变类型。

确保您的 UserDefaults 包含 NSNumber object 作为 uid 的值并且它不是字符串或整数等。我的意思是您应该将您的数字设置为 [=14] =]

 NSNumber *number = yournumber here ;

[[NSUserDefaults standardUserDefaults] setObject:number forKey:@"uid"];

如果您设置的是字符串对象,那么您不需要再将其转换为字符串!

我认为你没有设置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;
}

将您的 uid 分配代码更改为

NSNumber *uid = [NSNumber numberWithInteger:[[loginResult objectForKey:@"uid"] integerValue]];