NSDictionary objectForKey 运行时错误的 stringValue
Posted
技术标签:
【中文标题】NSDictionary objectForKey 运行时错误的 stringValue【英文标题】:stringValue of NSDictionary objectForKey runtime error 【发布时间】:2013-06-08 04:08:26 【问题描述】:所以我有以下代码导致 XCode 中出现运行时错误
NSString* temp = [[param objectforkey@"firstParam"] stringValue];
int tempNum = [[param objectforkey@"secondParam"] intValue];
参数从 plist 加载。 firstParam 为字符串,secondParam 为数字
第一行使程序崩溃。
现在有趣的是,如果我做一个硬种姓,它就会起作用,即:
NSString* temp = (NSString*)[param objectforkey@"firstParam"];
int tempNum = [[param objectforkey@"secondParam"] intValue];
只是想知道为什么 id 会有不一致的实现,因为我必须使用 intValue 转换为 int,但必须进行硬转换才能获得 NSString?为什么不是 stringValue?
【问题讨论】:
【参考方案1】:您对objectForKey
的第一次调用会返回一个NSString
对象。 NSString
没有 stringValue
方法,这就是生成运行时错误的原因。获取已经是字符串的东西的stringValue
是没有意义的。
对objectForKey
的第二次调用返回NSNumber
。 NSNumber
确实有一个 intValue
方法,所以它不会导致错误。
在第二种情况下,您将返回值的类型从 NSNumber
更改为 int
。在第一种情况下,返回的对象已经是 NSString
,尝试获取字符串的 stringValue
是没有意义的。
【讨论】:
嗯,当我不能确定返回值是NSString
时怎么办?我认为stringValue
将等同于java 的toString
,因此始终可用。
如果您不确定要从集合中检索的对象类型,则必须在调用适当的方法之前检查对象以查看其类型。【参考方案2】:
调用[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];
一样使用......对于目标不是很有用-C 应用程序)。
【讨论】:
谢谢亚历杭德罗。感谢为 cString 添加的解释。【参考方案3】:假设您调用了一个返回 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"];
希望这能暗示一些人!
【讨论】:
【参考方案4】:如果你不能确定返回的值是NSString
,你应该这样做:
id value = [param objectForKey@"firstParam"];
if ([value isKindOfClass:[NSString class]])
NSString *temp = (NSString *)id;
//Handle string
else
//Handle other case
【讨论】:
【参考方案5】:完成@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
【讨论】:
以上是关于NSDictionary objectForKey 运行时错误的 stringValue的主要内容,如果未能解决你的问题,请参考以下文章
NSDictionary objectForKey 随机回答
NSDictionary objectForKey 运行时错误的 stringValue