NSDictionary objectForKey运行时错误的stringValue

sno*_*und 4 casting nsdictionary nsstring

所以我有以下代码导致XCode中的运行时错误

NSString* temp = [[param objectforkey@"firstParam"] stringValue];
int tempNum = [[param objectforkey@"secondParam"] intValue];
Run Code Online (Sandbox Code Playgroud)

param从plist加载.firstParam是字符串,secondParam是数字

第一行崩溃了程序.

现在有趣的是,如果我做了一个艰苦的种姓,它是有效的,即:

NSString* temp = (NSString*)[param objectforkey@"firstParam"];
int tempNum = [[param objectforkey@"secondParam"] intValue];
Run Code Online (Sandbox Code Playgroud)

只是想知道为什么id会有不一致的实现,因为我必须使用intValue来转换为int,但是必须进行硬转换以获得NSString?为什么不stringValue?

mtt*_*trb 7

你第一次调用objectForKey返回一个对象NSString. NSString没有一个stringValue方法,这就是生成运行时错误的原因.获得stringValue已经是字符串的东西是没有意义的.

第二次调用objectForKey返回一个NSNumber.NSNumber确实有一个intValue方法,所以它不会导致错误.

在第二种情况下,您NSNumber要将返回值的类型更改为int.在第一种情况下,返回的对象已经是一个,NSString并且没有必要尝试获取stringValue字符串.


Ale*_*ván 6

调用[param objectforkey@"firstParam"]DOES返回一个NSString,因此不需要调用stringValue.此外,NSString没有名为"stringValue"的方法,因此这是您问题的根源.

请致电: NSString *temp = (NSString *)[param objectForKey:@"firstParam"];

另请注意,选择器是objectForKey : ,而不是objectforkey :(大写很重要).

并且,回答你的问题,NSNumber是一个类,所以任何对象都不是"int",而是NSNumber指针.intValue返回一个实际的"int",因为floatValue返回一个"float"(NSNumber可以表示任何类型的数字).在NSString的情况下,这是不必要的,因为只有一种类型的NSString(但是,有一种方法可以返回一个const char *,而且会被用来char *string = [[param objectForKey:@"firstParam"] cString];......对于Objective-C应用来说并不是很有用).