在模拟器上崩溃但在设备上没有崩溃: - [NSTaggedPointerString stringValue]:发送到实例

时间:2017-06-16 06:20:55

标签: ios error-handling ios-simulator nsnumber

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

4 个答案:

答案 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;
}