CocoaPod类别在运行时不可用

时间:2015-05-19 08:17:02

标签: ios objective-c clang cocoapods

我知道同样的问题有already been posted,但我认为我还面临另一个问题。

我创建了名为NSURLSession+PromiseKit的CocoaPod,允许将PromiseKit与NSURLSession一起使用。

我有定义:

@implementation NSURLSession (PromiseKit)

- (PMKPromise *)promiseDataTaskWithURL:(NSURL *)url {
    return [PMKPromise ...];
}

@end

代码示例:

NSURLSession *session = [NSURLSession sharedSession];
NSURL *url = [NSURL URLWithString:@"..."];
[session promiseDataTaskWithURL:url].then( ^(NSData *data) {
    NSLog(@"Result: %@", data);
}).catch( ^(NSError *e) {
    NSLog(@"Error: %@", e);
});

适用于iOS 8,但不适用于iOS 7.我收到此错误:

  

由于未捕获的异常终止应用' NSInvalidArgumentException',原因:' - [__ NSCFURLSession promiseDataTaskWithURL :]:无法识别的选择器发送到实例0x7c236720'

现在当然我虽然未加载类别,但我将此行添加到podspec以确保代码已加载:

s.xcconfig = { 'OTHER_LDFLAGS' => '-ObjC -all_load' }

但效果不佳。

所以我在category file添加了一行:

+ (void)load {
    NSLog(@"loaded");
}

令我惊讶的是调用了load方法,这意味着代码确实被加载了。所以为什么在加载代码时执行时找不到类别方法?

1 个答案:

答案 0 :(得分:1)

好的,经常发布问题会引导我找到答案。

NSURLSession不支持类别found

  • 在iOS 7中,基础NSURLSession类为__NSCFURLSession,不支持类别。
  • 在iOS 8中,基础类为__NSURLSessionLocal,它支持类别。

我的解决方案,虽然可以取代:

@implementation NSURLSession (PromiseKit)

人:

@implementation NSObject (PromiseKit)

仅限于实施文件。这将阻止Pod用户错误地使用除NSURLSession对象之外的其他方法。然而,这并不妨碍他发挥其他技巧使事情崩溃......