“-[__NSDictionaryI 长度]:无法识别的选择器发送到实例”没有 NSDictionary 的错误?
Posted
技术标签:
【中文标题】“-[__NSDictionaryI 长度]:无法识别的选择器发送到实例”没有 NSDictionary 的错误?【英文标题】:"-[__NSDictionaryI length]: unrecognized selector sent to instance" error without NSDictionary? 【发布时间】:2014-08-13 21:13:01 【问题描述】:在我的代码中,当我按下按钮打开弹出屏幕时,它应该从网站获取数据并将其存储在字符串中,然后将该字符串放入弹出屏幕上的 textview 中。当我运行程序并按下按钮进入弹出屏幕时,我收到一个 SIGABRT 错误和“-[__NSDictionaryI length]: unrecognized selector sent to instance”。经过研究,我发现当您尝试将 NSDictionary 引用到长度方法时会出现错误。我的代码中没有 NSDictionary,所以我不知道是什么导致了错误。
错误信息
[76416:60b] -[NSDictionaryI 长度]:无法识别的选择器发送到 实例 0x8f8ece0 2014-08-13 16:41:59.248 CWSGui[76416:60b] * 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[__NSDictionaryI 长度]: 无法识别的选择器发送到实例 0x8f8ece0' * 首先抛出调用栈:( 0 CoreFoundation 0x01c0d1e4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x0198c8e5 objc_exception_throw + 44 2 核心基础 0x01caa243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275 3 CoreFoundation 0x01bfd50b ___forwarding_ + 1019 4 核心基础 0x01bfd0ee _CF_forwarding_prep_0 + 14 5 基础 0x015aa4e4 -[NSConcreteAttributedString 长度] + 42 6 基础 0x015a9a6c -[NSConcreteAttributedString initWithString:attributes:] + 182 7 UIKit 0x00d5ae9d-[UITextView 设置文本:] + 125 8 CWSGui 0x0000805e -[SystemLog viewDidAppear:] + 686 9 UIKit 0x0076f099 -[UIViewController _setViewAppearState:isAnimating:] + 526 10 UIKit 0x0076f617 -[UIViewController viewDidAppear:] + 146 11 UIKit 0x00771014 __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 44 12 UIKit 0x0076f9aa -[UIViewController _executeAfterAppearanceBlock] + 63 13 UIKit 0x0066a0d0 ___afterCACommitHandler_block_invoke_2 + 33 14 UIKit 0x0066a055 _applyBlockToCFArrayCopiedToStack + 403 15 UIKit 0x00669e9a _afterCACommitHandler + 568 16 核心基础 0x01bd536e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 30 17 CoreFoundation 0x01bd52bf __CFRunLoopDoObservers + 399 18 CoreFoundation 0x01bb3254 __CFRunLoopRun + 1076 19 CoreFoundation 0x01bb29d3 CFRunLoopRunSpecific + 467 20 CoreFoundation 0x01bb27eb CFRunLoopRunInMode + 123 21 图形服务 0x03a3d5ee GSEventRunModal + 192 22 图形服务 0x03a3d42b GSEventRun + 104 23 UIKit 0x0064cf9b UIApplicationMain + 1225 24 CWSGui 0x00008e2d 主 + 141 25 libdyld.dylib 0x024be701 start + 1 ) libc++abi.dylib: 以未捕获的方式终止 NSException 类型的异常
视图出现
- (void)viewDidAppear:(BOOL)animated
NSUserDefaults *ipdefaults = [NSUserDefaults standardUserDefaults];
IPString = [ipdefaults objectForKey:@"IP"];
NSString *http = @"http://";
NSString *IPMiddle = [http stringByAppendingString:IPString];
NSString *IPFinal = [IPMiddle stringByAppendingString:@"/tasks"];
NSLog(@"Final IP: %@", IPFinal);
//array stuff from the ip
array = [[NSMutableArray alloc]init];
//make a connection
[self getIPWithIP:IPFinal];
NSString *str=@"http://example.com";
NSURL *url=[NSURL URLWithString:str];
NSData *data=[NSData dataWithContentsOfURL:url];
NSError *error=nil;
NSString *string = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error:&error];
NSLog(@"Your JSON Object: %@", string);
textField.text = string;
【问题讨论】:
您有问题吗? "我的代码中没有 NSDictionary" - Objective-C 是一种非常弱类型的语言,没有声明并不意味着你没有使用字典。+[NSJSONSerialization JSONObjectWithData:]
的返回值可能不是字符串,而是 - 显然 - 字典。你需要真正了解你在做什么。盲目地敲打-复制-粘贴代码不会有任何好处。
我打赌 NSJSONSerialization JSONObjectWithData
返回的是字典,而不是字符串。
NSLog(@"Your JSON Object: %@", string); textField.text = string;
"string" 不是一个。您直接从解析器获取 JSON,这意味着它肯定是 NSArray 或 NSDictionary。
正如@TheParamagneticCroissant 建议的那样,您需要了解您在做什么。简单地复制代码,尤其是在处理 JSON 时,几乎总是会给你带来麻烦。对于初学者,请访问 json.org 并学习 JSON 语法。只需 5-10 分钟,您必须先了解它,然后才能做其他任何事情。 (另外,NSLog 是你的朋友。)
【参考方案1】:
[NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error:&error];
从不返回字符串。一个 NSArray 或一个 NSDictionary。 (文档只承诺:数据中的 JSON 数据中的 Foundation 对象,如果发生错误,则为 nil。 因此它将来可能是另一种类型。
你的错误以
开头-[NSDictionaryI 长度]:
所以在你的情况下它是一个字典(NSDictionaryI 是 NSDictionary 的一个具体的不可变子类)。
仅仅因为你输入了变量NSString
,它并不会改变分配给它的对象。
【讨论】:
谢谢,我把它改成了 id response = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error:&error];并从那里我将其转换为我在文本字段中显示的字符串。【参考方案2】:您正在尝试获取实际上是NSDictionary
的NSString
的长度。这可能是一些 JSON 解析的结果。
【讨论】:
以上是关于“-[__NSDictionaryI 长度]:无法识别的选择器发送到实例”没有 NSDictionary 的错误?的主要内容,如果未能解决你的问题,请参考以下文章