Objective-C库分类方法在Swift应用程序环境中不起作用

Objective-C库分类方法在Swift应用程序环境中不起作用,objective-c,swift,ios8,categories,xcode6.3,Objective C,Swift,Ios8,Categories,Xcode6.3,我有一个Objective-CIOS应用程序,它由一个工作区(AuthPort.xcworkspace)和一个Objective-CSDK项目(AuthPort.xcodeproj)组成,后者构建了一个名为“libAnet SDK.a”的库 “libanetsdk.a”链接到AuthPort目标构建阶段 在SDK中,NSString上有一些类别内置到“libAnet SDK.a”中。他们的名字是: NSString+stringWithXMLTag.h和NSString+stringWithXM

我有一个Objective-CIOS应用程序,它由一个工作区(AuthPort.xcworkspace)和一个Objective-CSDK项目(AuthPort.xcodeproj)组成,后者构建了一个名为“libAnet SDK.a”的库

“libanetsdk.a”链接到AuthPort目标构建阶段

在SDK中,NSString上有一些类别内置到“libAnet SDK.a”中。他们的名字是:

NSString+stringWithXMLTag.h和NSString+stringWithXMLTag.m . . . 等等

AuthPort.xcodeproj中的某些代码调用库中的代码,而库又调用这些类别方法

在上述Objective-C环境中,一切都能顺利运行

现在,我正在一个新的工作区中,通过一个新的项目,并使用Objective-CSDK构建“libanetSDK.a”,在Swift中重新编写AuthPort代码

因此,我创建了一个名为AuthPort.xcodeproj的新Swift Xcode项目,并将其添加到名为AuthPort.xcworkspace的新工作区中。我还将authorize.net SDK(“ANet SDK.xcodeproj”,用Objective-C编写)添加到项目中

到目前为止,一切顺利。我创建了一个AuthPort bridgeing Header.h文件,并从SDK中导入了所有的头文件(没有类别头文件-稍后将对此进行详细介绍)。我还在AuthPort目标的构建阶段链接了“libanetsdk.a”

AuthPort生成和运行时没有错误或警告

现在,在主视图控制器的viewDidLoad中,我添加了访问库方法的代码,以便向公司authorize.net注册新设备:

var r: MobileDeviceRegistrationRequest = MobileDeviceRegistrationRequest()

an.mobileDeviceRegistrationRequest(r)
这两个调用在Objective-C和Swift版本中都是相同的库方法。最后一个方法调用其他库方法,这些库方法调用上述NSString类别中的方法

当我在Objective-C环境(应用程序和库中的所有Objective-C代码)的category方法中放置断点时,程序会按预期中断,我可以单步执行代码

当我在Swift环境(带有Objective-C库的Swift应用程序项目)的category方法中放置断点时,调试器从未进入category方法。在执行过程中的某一点上,应用程序SIGABRT具有以下功能:

2015-04-21 12:25:47.388 AuthPort[4743:2404231] +[NSString stringWithXMLTag:andValue:]: unrecognized selector sent to class 0x38450e18
2015-04-21 12:25:47.390 AuthPort[4743:2404231]*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+[NSString stringWithXMLTag:andValue:::未识别的选择器发送到类0x38450e18” *第一次抛出调用堆栈: (0x29a0a5a7 0x3792fc77 0x29a0f989 0x29a0d949 0x2993eb68 0xd9e4b 0xc301f 0xdd507 0xc4725 0xc44b1 0xb8f28 0xb9e60 0x2cf0eb65 0x2cf0e8d5 0x2D0031C43 0x2D0031AC7 0x2D0196B 0x2cf1b5f1 0x2d0357b3 0x2D003491F 0x2cf2433b 0x2cf159e1 0x2cf15003 0x2CF14B14E6B 0xF148EF 0x2cf121ef 0x2CF731 0x2D0017C0016AC7 0x2D003196B 0x2cf1b5f1 0x2D0880B1299D 0xB1299D 0x2CF1299D0521 0x299cecbf 0x2991bb51 0x2991b963 0x2cf72b8f 0x2cf6dc91 0xb5290 0x37ed8aaf) libc++abi.dylib:以NSException类型的未捕获异常终止 (lldb)

[NSString stringWithXMLTag:andValue:]来自库添加到NSString上的类别

库方法stringOfXMLRequest调用类别方法stringWithXMLTag:andValue:

- (NSString *) stringOfXMLRequest {

NSString *s = [NSString stringWithFormat:@""
               @"<merchantAuthentication>"
               @"%@"        //name (optional)
               @"%@"        //fingerPrint type Object                                      @"%@"        //transactionKey or
               @"%@"        //sessionToken or
               @"%@"        //password
               @"%@"        //mobileDeviceId (optional)
               @"</merchantAuthentication>",
               (self.name ? [NSString stringWithXMLTag:@"name" andValue:self.name] : @""),
               (self.fingerPrint ? [self.fingerPrint stringOfXMLRequest] : @""),
               (self.transactionKey ? [NSString stringWithXMLTag:@"transactionKey" andValue:self.transactionKey] : @""),
               (self.sessionToken ? [NSString stringWithXMLTag:@"sessionToken" andValue:self.sessionToken] : @""),
               (self.password ? [NSString stringWithXMLTag:@"password" andValue:self.password] : @""),
               (self.mobileDeviceId ? [NSString stringWithXMLTag:@"mobileDeviceId" andValue:self.mobileDeviceId] : @"")];

return s;
-(NSString*)stringOfXMLRequest{
NSString*s=[NSString stringWithFormat:@]
@""
@“%@”//name(可选)
@“%@”//fingerPrint类型对象@”%@”//transactionKey或
@“%@”//sessionToken或
@“%@”//密码
@“%@”//mobileDeviceId(可选)
@"",
(self.name?[NSString stringWithXMLTag:@“name”和value:self.name]:@“”),
(self.fingerPrint?[self.fingerPrint stringOfXMLRequest]:@“),
(self.transactionKey?[NSString stringWithXMLTag:@“transactionKey”和value:self.transactionKey]:@“”),
(self.sessionToken?[NSString stringWithXMLTag:@“sessionToken”和value:self.sessionToken]:@“”),
(self.password?[NSString stringWithXMLTag:@“password”和value:self.password]:@“”),
(self.mobileDeviceId?[nsstringwithxmltag:@“mobileDeviceId”和value:self.mobileDeviceId]:@');
返回s;
}

直到第二次调用transitionKey的stringWithXMLTag:andValue:时,SIGABRT才会发生

两种环境中运行的库代码完全相同

以下是调试程序中从未见过的stringWithXMLTag:andValue:中的代码:

+ (NSString *)stringWithXMLTag:(NSString *)t andValue:(NSString *)v {
if (v == nil) {
    return @"";
}
else { 
    v = [NSString stringWithEscapedXMLValue:v];
    return [NSString stringWithFormat:@"<%@>%@</%@>", t, v, t];
}
+(NSString*)stringWithXMLTag:(NSString*)t和value:(NSString*)v{
如果(v==nil){
返回@”;
}
否则{
v=[NSString stringWithEscapedXMLValue:v];
返回[NSString stringWithFormat:@“%@”,t,v,t];
}
}

问题只存在于库代码中,其中一个库方法调用另一个库方法,而另一个库方法调用的库类别方法从未在Swift版本的调试器中输入

我还尝试在桥接头中添加类别头文件,并将-ObjC和-all_load添加到AuthPort的其他链接器标志中。不走运

我在网上搜索了两天,运气都不好。希望你们中的一个人能看到这种行为

我正在使用Xcode 6.3和iOS 8.3构建(部署在iOS 8.2上)

谢谢。

请检查:

  • 您已将您的类别添加到框架项目的伞式框架中。使用
    #导入“your.h”
  • 我已将类别中的.h文件标记为public。选择.h>标识和类型>目标成员资格>公共
  • 在项目中,设置正确的框架搜索路径

  • libanetsdk.a是框架还是静态库?在我使用Objective-C框架的Swift项目中,我也不能设置断点,所以这应该是一个很好的雷达…它是一个SDK源代码库项目,是作为AuthPort项目的依赖项构建的,所以我猜它是一个框架