在 NSDictionary 中强制转换字符串值以使应用程序崩溃
Posted
技术标签:
【中文标题】在 NSDictionary 中强制转换字符串值以使应用程序崩溃【英文标题】:cast a string value in NSDictionary to long make app crash 【发布时间】:2014-07-22 04:52:44 【问题描述】:我有一个从服务器 API 获取的 NSDictionary 对象。数据是这样的,
"filesize_mp3":"60488"
当我使用以下代码检索文件大小时,应用程序崩溃。 obj.filesize 为长型。
obj.filesize = [[dict objectForKey:@"filesize_mp3"] longValue],
lldb 控制台,
2014-07-22 12:50:14.643 YouVoiceNews[2019:60b]-[__NSCFString longValue]:无法识别的选择器发送到实例 0x9bf8e10 2014-07-22 12:50:14.644 YouVoiceNews[2019:60b] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFString longValue]:无法识别的选择器发送到实例 0x9bf8e10”但是当我使用
obj.filesize = (long)[dict objectForKey:@"filesize_mp3"];
一切都很好。
所以我的问题是以上两种方式有什么区别。为什么第一个会导致应用崩溃?
提前致谢。
【问题讨论】:
读取错误。NSString
没有名为 longValue
的方法。请参阅NSString
的文档。
一个不带警告不工作,一个不带警告不工作。
您的第二行代码并没有按照您的想法执行。尽管没有崩溃,但这是完全错误的。
非常感谢。 Xcode 的智能感知显示了一个 longValue 方法。我应该更多地关注文档。更改为 longLongValue 或 integerValue 即可。
【参考方案1】:
回答问题 1:以上两种方式有什么区别?
-
第一种方法尝试将消息
-longValue
发送到存储在键 @"filesize_mp3" 处的对象
第二种方法尝试将指针转换为存储在键 @"filesize_mp3" 处的对象
回答问题 2:为什么第一个问题会导致应用崩溃?
-
存储在键 @"filesize_mp3" 处的对象是
NSString
,而 -longValue
是无效的选择器。首先编译代码的原因是因为[dict objectForKey:@"filesize_mp3"]
没有输入(它是id
),为了方便id
将在编译时接受任何选择器。下面提供了一种稍微保守的方法;将对象转换为 NSString
将不允许 [filesizeStr longValue]
。
第二种方法不会崩溃,因为您只是将指针转换为 long。虽然它没有给您任何感兴趣的东西,但它是一个有效的操作。
回答你没有问的问题:我应该怎么做?
您的字典包含NSString
,而不是NSNumber
,也不是int 或long。字典是NSObject
的集合。因此,您必须将这些字符串转换为 int
、long
或您认为合适的任何格式。
NSString * filesizeStr = [dict objectForKey:@"filesize_mp3"];
obj.filesize = [filesizeStr longLongValue];
【讨论】:
关于在第二行投射赋值的任何想法:obj.filesize = (long) [filesizeStr longLongValue];
? (我假设filesizeStr
是long
,并且这些值总是适合长)。以上是关于在 NSDictionary 中强制转换字符串值以使应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 将 JSON 字符串转换为 NSDictionary
如何将 swift Dictionary 转换为 NSDictionary