Objective c 将NSNumber对象分配给NSString对象赢得';不要引起任何错误或警告

Objective c 将NSNumber对象分配给NSString对象赢得';不要引起任何错误或警告,objective-c,ios,cocoa,nsobject,Objective C,Ios,Cocoa,Nsobject,我将NSNumber对象放入NSDictionary对象中,然后弹出并将其分配给声明为NSString实例的变量 NSString *test; NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1000] forKey:@"key"]; test = [dict valueForKey:@"key"]; NSLog(@"%@, type of %@", test, NSStringF

我将NSNumber对象放入NSDictionary对象中,然后弹出并将其分配给声明为NSString实例的变量

NSString *test;
NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1000] forKey:@"key"];

test = [dict valueForKey:@"key"];
NSLog(@"%@, type of %@", test, NSStringFromClass([test class]));

return 0;
运行上述代码后,我发现声明为(NSString*)的测试类型是uu NSCFNumber。为什么会发生这种情况,为什么编译器没有给出警告或错误?
我是否必须使用NSString构造函数,例如NSStringWithFormat…,才能将测试作为NSString的实例?

之所以没有失败或警告您,是因为
valueForKey:
返回类型为
id
的对象,您可以将该对象分配给任何Objective-C类型。您需要了解从集合中获得的值的类型,以便安全地使用它们。在这种情况下,您知道它包含一个
NSNumber
,因此您应该期待一个
NSNumber
,如果您需要一个字符串,则需要进行适当的转换

NSNumber *test = [dict valueForKey:@"key"];
NSLog(@"%@, type of %@", test, NSStringFromClass([test class]));

//If you need a string
NSString *testStr = [test stringValue];

此操作未失败或未向您发出警告的原因是
valueForKey:
返回类型为
id
的对象,您可以将该对象分配给任何Objective-C类型。您需要了解从集合中获得的值的类型,以便安全地使用它们。在这种情况下,您知道它包含一个
NSNumber
,因此您应该期待一个
NSNumber
,如果您需要一个字符串,则需要进行适当的转换

NSNumber *test = [dict valueForKey:@"key"];
NSLog(@"%@, type of %@", test, NSStringFromClass([test class]));

//If you need a string
NSString *testStr = [test stringValue];

欢迎来到动态键入的世界。可能的副本:欢迎来到动态键入的世界。可能的副本: