我有一个来自服务器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"];
一切都很好。
所以我的问题是上述两种方式之间的区别。为什么第一个导致应用程序崩溃?
提前致谢。
答案 0 :(得分:6)
回答问题1 :上述两种方式之间的区别是什么?
-longValue
发送到存储在key @“filesize_mp3”的对象回答问题2 :为什么第一个会导致应用崩溃?
NSString
,而-longValue
是无效的选择器。首先编译代码的原因是因为[dict objectForKey:@"filesize_mp3"]
没有输入(它是id
),为方便起见,id
将在编译时接受任何选择器。下面提供了一种稍微保守的方法;将对象强制转换为NSString
将不允许[filesizeStr longValue]
。回答您未提出的问题:我该怎么做?
您的词典包含NSString
,而不是NSNumber
,也不是int或long。字典是NSObject
的集合。因此,您必须将这些字符串转换为int
,long
或您认为合适的任何格式。
NSString * filesizeStr = [dict objectForKey:@"filesize_mp3"];
obj.filesize = [filesizeStr longLongValue];