“-[__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】:

您正在尝试获取实际上是NSDictionaryNSString 的长度。这可能是一些 JSON 解析的结果。

【讨论】:

以上是关于“-[__NSDictionaryI 长度]:无法识别的选择器发送到实例”没有 NSDictionary 的错误?的主要内容,如果未能解决你的问题,请参考以下文章