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

Rad*_*adu 4 iphone xcode objective-c

我有一个静态库,我用于加密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]];
Run Code Online (Sandbox Code Playgroud)

ser*_*gio 12

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

所以你应该在你的项目中添加"NSData + Base64.*"文件.从这里获取它们.

编辑:

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

-ObjC
Run Code Online (Sandbox Code Playgroud)

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

  • 右键单击NSData + Base64.m,获取该文件的信息并确保将其添加到您正在编译的目标中... (3认同)