在 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 的集合。因此,您必须将这些字符串转换为 intlong 或您认为合适的任何格式。

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

【讨论】:

关于在第二行投射赋值的任何想法:obj.filesize = (long) [filesizeStr longLongValue];? (我假设filesizeStrlong,并且这些值总是适合长)。

以上是关于在 NSDictionary 中强制转换字符串值以使应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 将 JSON 字符串转换为 NSDictionary

如何将 swift Dictionary 转换为 NSDictionary

如何强制用户从下拉列表和按钮中选择一个值以启用保存按钮?

将 Json 转换为 NSDictionary

Python:将字符串列表转换为布尔值,其中布尔值以字符串形式存在[重复]

将日期从 NSDictionary 序列化为 JSON 时强制区域?