在模拟器上崩溃但在设备上不崩溃:-[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]];
我实现了一些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]];