在NSDictionary中强制转换一个字符串值以使应用程序崩溃

时间:2014-07-22 04:52:45

标签: ios objective-c nsstring

我有一个来自服务器API的NSDictionary对象。数据是这样的,

  

" filesize_mp3":" 60488"

当我使用以下代码检索文件大小时,应用程序崩溃。 obj.filesize是long类型。

obj.filesize = [[dict objectForKey:@"filesize_mp3"] longValue],

lldb console,

2014-07-22 12:50:14.643 YouVoiceNews[2019:60b] -[__NSCFString longValue]: unrecognized selector sent to instance 0x9bf8e10
2014-07-22 12:50:14.644 YouVoiceNews[2019:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString longValue]: unrecognized selector sent to instance 0x9bf8e10'

但是当我使用

obj.filesize = (long)[dict objectForKey:@"filesize_mp3"]; 

一切都很好。

所以我的问题是上述两种方式之间的区别。为什么第一个导致应用程序崩溃?

提前致谢。

1 个答案:

答案 0 :(得分:6)

回答问题1 上述两种方式之间的区别是什么?

  1. 第一种方法尝试将消息-longValue发送到存储在key @“filesize_mp3”的对象
  2. 第二种方法尝试将指针强制转换为存储在key @“filesize_mp3”
  3. 中的对象

    回答问题2 为什么第一个会导致应用崩溃?

    1. 存储在key @“filesize_mp3”中的对象是NSString,而-longValue是无效的选择器。首先编译代码的原因是因为[dict objectForKey:@"filesize_mp3"]没有输入(它是id),为方便起见,id将在编译时接受任何选择器。下面提供了一种稍微保守的方法;将对象强制转换为NSString将不允许[filesizeStr longValue]
    2. 第二种方法不会崩溃,因为您只是将指针强制转换为long。虽然它没有给你任何感兴趣,但这是一个有效的操作。
    3. 回答您未提出的问题我该怎么做?

      您的词典包含NSString,而不是NSNumber,也不是int或long。字典是NSObject的集合。因此,您必须将这些字符串转换为intlong或您认为合适的任何格式。

      NSString * filesizeStr = [dict objectForKey:@"filesize_mp3"];
      obj.filesize = [filesizeStr longLongValue];