我有一个静态库,我用于加密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]];
答案 0 :(得分:12)
据我所知,base64EncodingWithLineLength
是一种未在NSData
中定义但在名为NSData+Base64.h
的类别中定义的方法。您收到错误的原因是您没有将该类别添加到项目中,因此调用该方法,但找不到该方法。
因此,您应该将“NSData + Base64。*”文件添加到您的项目中。从here获取它们。
编辑:
由于OP提到该类别包含在静态库中并且假设静态库已正确链接,因此针对此问题的可能修复是添加
-ObjC
标记为“构建设置”中的“其他链接器标志”。此标志将强制加载Objective C类别中的所有符号,从而阻止它们通过链接器进行优化。
答案 1 :(得分:2)
我担心base64EncodingWithLineLength:
是附加到NSData
的类别方法。这意味着您应该针对base64EncodingWithLineLength
类别实现NSData
的代码进行编译/链接。
答案 2 :(得分:0)
如果类别引用核心数据实体,则可以提供帮助: 在托管对象模型中为实体设置类。