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

Let*_*ies 1 objective-c nsstring ios

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

"filesize_mp3": "60488"

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

obj.filesize = [[dict objectForKey:@"filesize_mp3"] longValue],
Run Code Online (Sandbox Code Playgroud)

lldb控制台,

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"]; 
Run Code Online (Sandbox Code Playgroud)

一切都好.

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

提前致谢.

Swi*_*ect 6

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

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

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

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

回答你没有问的问题:我该怎么做?

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

NSString * filesizeStr = [dict objectForKey:@"filesize_mp3"];
obj.filesize = [filesizeStr longLongValue];
Run Code Online (Sandbox Code Playgroud)