【问题标题】:Can't get an NSString out of a JSON object无法从 JSON 对象中获取 NSString
【发布时间】:2015-09-28 15:26:31
【问题描述】:

我正在从 NSMutableDictionary 中获取一个元素,该元素是通过从 NSURLSessionDataTask 取回数据并使用 NSJSONSerialization 将其反序列化而创建的,如下所示:

NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data 
                                                     options:kNilOptions 
                                                       error:&error];

所以在返回 JSON 后,我将它缓存在 NSCache 中,然后当我再次拿起它使用时,我尝试获取一个似乎显示为 NSNumber 的元素:

NSString *hopefullyAString = [[NSNumber numberWithLong:settings[@"hopefullyAString"] stringValue]]; 

现在我设置断点,这就是我插入控制台的内容:

(lldb) po labs(hopefullyAString.longValue)
error: property 'longValue' not found on object of type 'NSString *'
error: 1 errors parsing expression

(lldb) po [hopefullyAString isKindOfClass:[NSString class]]
false

这很奇怪,因为一方面我无法获得 NSString 的 longValue,但显然,所谓的字符串不是 NSString。怎么回事?

最终,这就是我想要的:

anotherString = [anotherString stringByAppendingString:hopefullyAString];

但是当我插入它时,我得到一个错误:

(lldb) po queryParams = [anotherString stringByAppendingString:hopefullyAString]
2015-09-28 11:22:09.946 SomeApp[826:265400] -[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000004cfa73
error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3)..
The process has been returned to the state before expression evaluation.

如果我尝试通过断点播放(附加字符串):

2015-09-28 11:23:41.804 SomeApp[826:265400] -[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000004cfa73
 2015-09-28 11:23:41.806 SomeApp[826:267251] XPC connection interrupted
2015-09-28 11:23:41.809 SomeApp[826:265400] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000004cfa73'
*** First throw call stack:
(0x182154f5c 0x196c57f80 0x18215bc6c 0x182158c14 0x18205cdcc 0x182fac88c 0x1000db8d4 0x1000db670 0x1000d390c 0x1879ed67c 0x1879ed7d4 0x1879dd3d4 0x1879f2364 0x187793a90 0x1876a700c 0x186eadf14 0x186ea8b20 0x186ea89e0 0x186ea807c 0x186ea7dd0 0x186ea14bc 0x18210bc30 0x1821099d4 0x182109e04 0x182038dc0 0x18d18c088 0x187712f60 0x1000d5f6c 0x1974828b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

我知道这可能是我不理解的小问题,所以提前谢谢。

编辑 1:忘了提及...我正在使用 Xcode 7,不确定这是否相关,但几周前当我回到 Xcode 6 时,相同的代码仍在工作。

【问题讨论】:

  • 是设置字典吗?
  • 尝试:id hopefullyAString = settings[@"hopefullyAString"]; NSLog("Type %@", [hopefullyAString class]); 它应该记录该键的值的类型,这将帮助您弄清楚发生了什么。
  • 是的,设置是一本字典 - 谢谢,我试过了......现在它正在工作。希望这是一个编码修复,但我想如果您对 Xcode 有出色的更新,请尽快接受。

标签: ios objective-c json nsstring


【解决方案1】:

调试器中的第一条错误消息是因为您告诉它hopefullyAString 是一个字符串,它相信您说的是真话,然后尝试调用NSString 上不存在的方法。

第二个调试器命令是假的,因为现在它实际上正在检查自己是否是 NSString 并发现它不是。

您的其他错误是因为您将NSNumber(您的hopefullyAString 实际上是什么)传递给采用NSString 的方法。

您分配 hopefullyAString 的代码块不是有效的语法并且不会编译,因此很难说出您具体需要更改什么,但您不应该将 objc 对象传递给numberWithLong 反正。

【讨论】:

  • NSString *hopefullyAString = [[NSNumber numberWithLong:settings[@"hopefullyAString"] stringValue]];这是有效的 - 它编译 - NSNumber 的 stringValue 是有效的。我也试过 NSString *hopefullyAString = [NSString stringWithFormat:@"%ld", settings[@"hopefullyAString"]];
  • 获取NSNumber 的字符串值是有效的,但是您的] 位于错误的位置,因此您的sn-p 特别不会编译。但重点是settings[@"hopefullyAString"] 不能返回long,因此将其传递给numberWithLong 是错误的。
  • 这真的很奇怪......你对我支架的位置是正确的,但我正在清理然后在我的手机上构建和运行它,它正在“编译”但从未发现错误。刚刚升级了我的 xcode 命令行工具并重新启动了我的计算机并切换了支架位置,现在它可以工作了。不知道究竟是什么修复了它,但它似乎是 Xcode 中的一个错误,已在最后一次 Xcode 命令工具更新中修复,或者我的 mac 处于奇怪的状态。
【解决方案2】:

错误:在“NSString *”类型的对象上找不到属性“longValue”

这不足为奇:NSString 没有 longValue 属性。但是,有一个 longLongValue 属性,我希望这就是您的想法。

-[__NSCFNumber 长度]:无法识别的选择器发送到实例 0xb0000000004cfa73

在这种情况下,问题在于anotherString,它似乎没有指向NSString 的有效实例。您是否正确初始化anotherString?你应该这样做:

NSString *anotherString = @"Some string."
anotherString = [anotherString stringByAppendingString:hopefullyAString];

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFNumber 长度]:无法识别的选择器发送到实例 0xb0000000004cfa73”

是的,在抛出异常时通常会终止应用程序。修复你的代码,异常就会消失。但是,该消息告诉您,您正在尝试将-length 消息发送到NSNumber 的实例,该实例没有-length 方法。我猜hopefullyAString 中的对象在 JSON 文件中表示为数字而不是字符串,因此在反序列化时会返回一个数字。

【讨论】:

  • 是的,你也是对的,我得到了一个 NSNumber,这就是为什么我试图使用 stringWithFormat 或获取 NSNumber 的 stringValue 将其转换为 NSString... 似乎是Xcode 本身存在问题,新的更新修复了该错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 2016-07-27
  • 2015-04-03
相关资源
最近更新 更多