Xcode,无法识别的选择器发送到实例 - 但在哪一行?

Posted

技术标签:

【中文标题】Xcode,无法识别的选择器发送到实例 - 但在哪一行?【英文标题】:Xcode, unrecognized selector sent to instance - but on what line? 【发布时间】:2014-07-31 14:35:08 【问题描述】:

我在处理 JSON 时遇到了常见错误,

-[NSNull length]: unrecognized selector sent to instance 0x102aa8b50

我完全理解这一点,知道如何处理它等等(顺便说一句,这是一个聪明的方法https://***.com/a/16610117/294884)

我的问题是,在 Xcode 中,我如何判断是哪个 [length] 调用导致了问题??

Xcode 似乎只是显示它发生在“main 的第 7 行”-!

我不是 Xcode 调试专家,该怎么办?

顺便说一句,关于特定示例问题(NSNull 问题),我提请您注意 JR 在下面提到的令人惊叹的库:github.com/jrturton/NSJSONSerialization-NSNullRemoval

【问题讨论】:

在此处发布该崩溃日志的其余部分。 (你可以复制粘贴) 请发布整个崩溃日志。 可能对您有用:github.com/jrturton/NSJSONSerialization-NSNullRemoval 【参考方案1】:

在 Xcode 的断点窗格中添加一个“异常断点”。

添加此代码后,代码引发的所有异常大多数情况下都会在正确的行上突出显示。

您将获得 NSNull 对象,因为 JSON 包含以下内容:


    "someKey": null

然后,当您使用[json objectForKey:@"someKey"] 获取值时,它将返回一个NSNull 对象而不是nil。因为nil 意味着 kay 不存在,这是它的。

您可以使用简单的 Objective-C 类别轻松解决此问题:

NSDictionary+NotNull.h

#import <Foundation/Foundation.h>

/*! This category extends NSDictionary to work around an issue with NSNull object.
 */
@interface NSDictionary (NotNull)

/*! @abstract Returns the value associated with a given key, but only if the value is not NSNull.
    @param aKey The key for which to return the corresponding value.
    @return The value associated with the given key, or nil if no value is associated with the key, or the value is NSNull.
 */
- (id)objectOrNilForKey:(id)aKey;

NSDictionary+NotNull.m

#import "NSDictionary+NotNull.h"

@implementation NSDictionary (NotNull)

- (id)objectOrNilForKey:(id)aKey

    id object = [self objectForKey:aKey];
    if (object == [NSNull null]) 
        return nil;
    
    return object;


@end

【讨论】:

嗨 RC ...“将在正确的行上突出显示,大部分时间”——它对我不起作用!啊! PS正如我提到的,我完全理解如何解决手头的问题;我只是想知道到底如何让 Xcode 告诉我它发生在哪里?!谢谢! 该死——它刚刚成功了! :) 显然 Xcode 害怕你 :) 我猜它“有时不起作用”对吗?谢谢! 这就是为什么我说“大部分时间”,因为有时它没有捕捉到正确的行或突出显示错误的行。 Gotchya - 我想这就是关键。只是待定,为什么会发生这种情况 - 有什么要理解的吗? 好吧,当您将从 JSON 检索到的对象传递给 Objective-C 框架深处的某个其他类或方法时,它正在调用 length 方法,因为它认为传递的对象是NSString.

以上是关于Xcode,无法识别的选择器发送到实例 - 但在哪一行?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode - presentViewController NSInvalidArgumentException:无法识别的选择器发送到实例

XCode6/Swift:发送到实例的无法识别的选择器

Swift 3:发送到实例 Xcode 8 的无法识别的选择器 [重复]

斯威夫特:“无法识别的选择器发送到实例”,Xcode 9.4.1

Swift 3 Xcode 8 - SwiftValue encodeWithCoder - 发送到实例的无法识别的选择器

UIImageView |无法识别的选择器发送到实例 | Xcode 6.4 | iOS 8.4