所以我有以下代码导致XCode中的运行时错误
NSString* temp = [[param objectforkey@"firstParam"] stringValue];
int tempNum = [[param objectforkey@"secondParam"] intValue];
param从plist加载。 firstParam是字符串,secondParam是数字
第一行崩溃了该程序。
现在有趣的是,如果我做了一个艰苦的种姓,那就有用了:
NSString* temp = (NSString*)[param objectforkey@"firstParam"];
int tempNum = [[param objectforkey@"secondParam"] intValue];
只是想知道为什么id会有不一致的实现,因为我必须使用intValue来转换为int,但是必须进行硬转换以获得NSString?为什么不stringValue?
答案 0 :(得分:7)
您第一次拨打objectForKey
会返回一个NSString
的对象。 NSString
没有stringValue
方法,这就是生成运行时错误的原因。获取已经是字符串的东西的stringValue
是没有意义的。
第二次调用objectForKey
会返回NSNumber
。 NSNumber
确实有intValue
方法,因此不会导致错误。
在第二种情况下,您要将返回值的类型从NSNumber
更改为int
。在第一种情况下,返回的对象已经是NSString
,并且没有必要尝试获取字符串的stringValue
。
答案 1 :(得分:6)
调用[param objectforkey@"firstParam"]
会返回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应用程序非常有用。)
答案 2 :(得分:2)
假设您调用返回JSON的Web服务
然后你处理数据
NSDictionary *json_response = [NSJSONSerialization JSONObjectWithData:data
options:0
error:NULL];
现在你尝试这样的事情
NSString *name = [[object objectForKey:@"Name"] stringValue];
然后你得到错误....
由于mttrb提到你因为stringValue而得到错误,因此objectForKey的默认返回值是String,所以在这种情况下可能的修复是:
NSString *name = [object objectForKey:@"Name"];
希望这暗示一些人!
答案 3 :(得分:1)
如果您无法确定返回的值是否为NSString
,则应执行此操作:
id value = [param objectForKey@"firstParam"];
if ([value isKindOfClass:[NSString class]]) {
NSString *temp = (NSString *)id;
//Handle string
}
else {
//Handle other case
}
答案 4 :(得分:0)
完成@Torge的答案,我添加了我的解决方案,以便始终从objectForKey方法获取NSString:
NSObject * value = [param objectForKey@"firstParam"];
NSString *stringValue;
if ([value isKindOfClass:[NSString class]]) {
//Handle string
stringValue = (NSString *)value;
}
else if([value isKindOfClass:[NSNumber class]]){
//Handle NSNumber
stringValue = [((NSNumber *) value) stringValue];
}
else {
//Handle other case
}