【问题标题】:Unrecognized selector when using sbjson使用 sbjson 时无法识别的选择器
【发布时间】:2012-03-04 04:43:01
【问题描述】:

我正在尝试按照本教程http://ios-blog.co.uk/iphone-development-tutorials/parsing-json-on-ios-with-asihttprequest-and-sbjson/ 同时进行 ASIHttp 和 SBJSon 教程,并且一切都很好,直到上线

NSMutableArray *colorTitles = [jsonDictionary objectForKey:@"title"];

它会因错误而崩溃的地方

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x9340d20'

我已经尝试使用 NSArray、NSString 并且我的想法已经用完了......我的代码与链接完全一样

【问题讨论】:

    标签: ios json sbjson


    【解决方案1】:

    这可能发生在您尝试调用不属于相应类或其超类的方法时,然后在这种情况下您会收到错误:unrecognized selector sent to instance

    所以检查你得到的 JSON。 根据 JSON Response(data) 尝试解析它。

    我想告诉你关于 JSON:

    JSON is built on two structures:

    A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.
    An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.
    

    在 JSON 中,它们采用以下形式:

    对象

    对象是一组无序的名称/值对。对象以 {(左大括号)开始,以 }(右大括号)结束。每个名称后跟 :(冒号),名称/值对用 ,(逗号)分隔。

    数组:

    数组是值的有序集合。数组以 [(左括号)开头,以 ](右括号)结尾。值用 ,(逗号)分隔。

    价值

    值可以是双引号中的字符串、数字、true 或 false 或 null,也可以是对象或数组。这些结构可以嵌套。

    我认为您正在获取值 JSON,因此请尝试以下操作。还有一件事你不能从字面上将值分配(创建对象)给 NSmutableArray。所以请按以下方式进行。

    NSArray *colorTitles = [jsonDictionary valueForKey:@"title"];
    

    如果您仍然没有得到正确的结果。

    http://www.json.org/

    【讨论】:

    • 呃,很抱歉格式跑了,但它是这样的,是的,我将其更改为 nsarray 但仍然与错误结果相同
    • 抱歉粘贴了不相关的 json,但 json 与我做教程时一样 colourlovers.com/api/colors?format=json
    • 我认为 json 结构是一个对象数组?
    • 这里你得到了值的数组,你的值是对象,请让我检查更多。等一下......!!
    • 使用 NAArray 代替 NSMUtableArray 作为: NSArray *colorTitles = [jsonDictionary valueForKey:@"title"];
    【解决方案2】:

    objectForKeyNSDictionary 的方法,而不是NSArray。您可能在 JSON 字符串解析中遗漏(或过度)了一个步骤。

    【讨论】:

    • 我已经完全按照该网站上的步骤进行操作,是否是我分配 objectForKey 的类型错误?如果是,正确的类型应该是什么?
    • @eddy 请看你正在向 NSMutableArray 分配一些值,这是不对的,此时可能会发生崩溃。第二件事你需要检查你的 JSON 响应(你得到的值,数组, object)。在您调用 [jsonDictionary objectForKey:@"title"]; 的代码中。您可能获取的是值而不是 Object。所以检查你的回应
    【解决方案3】:

    通常,当您尝试访问已释放的对象时会出现这种错误。检查您是否过度释放或不保留jsonDictionary

    【讨论】:

    • 我保留`jsonDictionary是对的吗,这意味着我需要在.h文件中用@property(retain)这样声明它?还是我的想法错了:(
    • 无需转至 .h 文件。仅检查您没有在此行之前释放对象。如果您在相同的方法中声明了变量,这应该可以工作。你能贴一下这个方法的代码吗?
    • @Sailesh this is not true 当您尝试访问对应类(或其子类)中不存在的方法时会出现此错误。
    • 是的,但是为什么在这种情况下会发生这种情况,当对象被声明为 NSMutableDictionary 时?这是因为该对象已解除分配,并且在运行时,该内存地址表示一些随机数据,这些数据被错误地读取为__NSArrayM 对象。请注意,这甚至不是NSArray,而是一些内部类。因此,一种合理的解释是,驻留在该内存位置上的任何内容现在都已释放且无法访问。
    • 我只在方法中声明了 NSMutable/NSArray 并没有发布,据我所知......
    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多