我从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时,相同的代码正在运行。< / p>
答案 0 :(得分:1)
调试器中的第一条错误消息是因为您告诉它hopefullyAString
是一个字符串,并且它相信您说的是实话,然后尝试调用{{上不存在的方法1}}。
第二个调试器命令是false,因为现在它实际上是在检查它是NSString
并且发现它不是。
您的其他错误是因为您将NSString
(NSNumber
实际上是什么)传递给采用hopefullyAString
的方法。
您分配NSString
的代码块不是有效的语法,不会编译,因此很难说出您需要更改的内容,但是您不应该传递一个objc无论如何都反对hopefullyAString
。
答案 1 :(得分:1)
错误:属性&#39; longValue&#39;在#NSString *&#39;
类型的对象上找不到
这并不奇怪:NSString
没有longValue
属性。但是,有一个longLongValue
属性,我希望这就是你想到的。
- [__ NSCFNumber length]:无法识别的选择器发送到实例0xb0000000004cfa73
在这种情况下,问题出在anotherString
,它似乎没有指向NSString
的有效实例。您是否正确初始化了anotherString
?你应该这样做:
NSString *anotherString = @"Some string."
anotherString = [anotherString stringByAppendingString:hopefullyAString];
***由于未捕获的异常终止应用程序&#39; NSInvalidArgumentException&#39;,原因:&#39; - [__ NSCFNumber长度]:无法识别的选择器发送到实例0xb0000000004cfa73&#39;
是的,终止应用程序是抛出异常时通常会发生的事情。修复你的代码,异常就会消失。但是,该消息告诉您,您正在尝试将-length
消息发送到NSNumber
的实例,该实例没有-length
方法。我猜测hopefullyAString
中的对象在JSON文件中表示为数字而不是字符串,因此在反序列化时会得到一个数字。