【问题标题】:cast a string value in NSDictionary to long make app crash在 NSDictionary 中强制转换字符串值以使应用程序崩溃
【发布时间】: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 即可。

标签: ios objective-c nsstring


【解决方案1】:

回答问题 1以上两种方式有什么区别?

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

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

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

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

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

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

【讨论】:

  • 关于在第二行投射赋值的任何想法:obj.filesize = (long) [filesizeStr longLongValue];? (我假设filesizeStrlong,并且这些值总是适合长)。
猜你喜欢
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多