调用类别方法时,无法识别的选择器发送到实例

时间:2011-07-18 11:11:39

标签: iphone objective-c xcode

我有一个静态库,我用于加密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]];

3 个答案:

答案 0 :(得分:12)

据我所知,base64EncodingWithLineLength是一种未在NSData中定义但在名为NSData+Base64.h的类别中定义的方法。您收到错误的原因是您没有将该类别添加到项目中,因此调用该方法,但找不到该方法。

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

编辑:

由于OP提到该类别包含在静态库中并且假设静态库已正确链接,因此针对此问题的可能修复是添加

-ObjC

标记为“构建设置”中的“其他链接器标志”。此标志将强制加载Objective C类别中的所有符号,从而阻止它们通过链接器进行优化。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果类别引用核心数据实体,则可以提供帮助:    在托管对象模型中为实体设置类。