min*_*end 0 cocoa objective-c nsobject ios
我已将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;
Run Code Online (Sandbox Code Playgroud)
运行上面的代码后,我发现声明为(NSString*)的测试类型是__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];
Run Code Online (Sandbox Code Playgroud)