【问题标题】:Unrecognized selector sent to instance when calling category method调用类别方法时发送到实例的无法识别的选择器
【发布时间】:2011-07-18 11:11:39
【问题描述】:

我有一个静态库,用于加密我在项目中使用的 XML 序列化。 到目前为止,这段代码运行良好。但是当我将它包含在我的最新项目中时出现错误,我知道当我调用的对象未正确分配时通常会出现此错误女巫不是这里的情况,NSLog 返回我的加密的 NSData。

可能是什么问题?

我得到的错误是

-[NSConcreteData base64EncodingWithLineLength:]:无法识别的选择器 发送到实例 0x1c9150

* 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[NSConcreteData base64EncodingWithLineLength:]: 无法识别的选择器发送到实例 0x1c9150'

这是我的代码:

NSData * encryptedMsg =[crypto encrypt:MsgEnc key:[accessdata->Certificate dataUsingEncoding:NSUTF8StringEncoding] padding:&padding];
        NSLog(@"encryptedMsg %@",encryptedMsg);
        NSString * msg = [NSString stringWithFormat:@"%@", [encryptedMsg base64EncodingWithLineLength:0]];

【问题讨论】:

    标签: iphone objective-c xcode


    【解决方案1】:

    据我所知,base64EncodingWithLineLength 是一个没有在NSData 中定义的方法,而是在一个名为NSData+Base64.h 的类别中。报错的原因是你的项目中没有添加那个category,所以调用了这个方法,没有找到。

    因此,您应该将“NSData+Base64.*”文件添加到您的项目中。从here 获取它们。

    编辑:

    由于 OP 提到该类别包含在静态库中并假设静态库已正确链接,因此可能解决此问题的方法是添加

    -ObjC
    

    标记到您的构建设置中的“其他链接器标记”。此标志将强制加载 Objective C 类别中的所有符号,防止它们通过链接器被优化。

    【讨论】:

    • 我已经做了,我检查了两次难道是项目的一些设置问题?我最近切换到 xCode 4.0.2
    • 右键单击 NSData+Base64.m,获取该文件的信息并确保将其添加到您正在编译的目标中...
    • 包含在内,我不知道出了什么问题,但现在可以了.坦克的帮助。在“无法识别的选择器发送到实例”的正常情况下,您的解决方案将是解决此母猪的问题,我会将其标记为正确答案,干杯
    • 这里相同;它包括在内。这发生在 Soomla iOSStore 项目中。他们称之为它,并将其包含在他们的项目中,我在我的项目中有参考。
    • @Almo:如果您使用的是包含 NSData 扩展的静态库,请确保使用 -ObjC 和 -load_all 链接器标志对其进行编译。
    【解决方案2】:

    恐怕base64EncodingWithLineLength: 是附加到NSData 上的类别方法。这意味着您应该针对为NSData 类别实现base64EncodingWithLineLength 的代码进行编译/链接。

    【讨论】:

      【解决方案3】:

      如果 category 引用 Core Data 实体会有所帮助: 为托管对象模型中的实体设置类。

      【讨论】:

        猜你喜欢
        • 2019-08-28
        • 2012-07-24
        相关资源
        最近更新 更多