首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLSessionTask类别方法使用“未识别的选择器发送到实例”崩溃

NSURLSessionTask类别方法使用“未识别的选择器发送到实例”崩溃
EN

Stack Overflow用户
提问于 2014-06-27 09:53:05
回答 3查看 1.5K关注 0票数 6

我需要向NSURLSessionTask添加方法。这是我的分类,应该是这样的:

代码语言:javascript
复制
//  NSURLSessionTask+Extras.h

#import <Foundation/Foundation.h>

@interface NSURLSessionTask (Extras)

- (void)helloNSURLSessionTask;

@end

//  NSURLSessionTask+Extras.m

#import "NSURLSessionTask+Extras.h"

@implementation NSURLSessionTask (Extras)

- (void)helloNSURLSessionTask {
    NSLog(@"hello NSURLSessionTask!");
}

@end

所有的东西都编译得很好,自动完成工作,但是当我调用这个方法时,我的应用程序崩溃了:

代码语言:javascript
复制
2014-06-27 12:32:23.916 Test[4333:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFLocalDataTask helloNSURLSessionTask]: unrecognized selector sent to instance 0x109723310'

如果我将类别添加到NSObject中,并且我似乎无法理解为什么它不适用于NSURLSessionTask,同样的方法也是有效的。

下面是一个为我重现这个问题的测试项目:https://dl.dropboxusercontent.com/u/25100182/Test.zip

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-27 10:45:15

不幸的是,NSURLSession似乎不能支持类别。我遇到了这样一个问题,试图添加一个相关的对象。

另见here

票数 5
EN

Stack Overflow用户

发布于 2015-03-09 03:42:40

我在NSURLSessionDataTask类别中也有类似的问题,当我将范围缩小为NSURLSessionTask时,它似乎工作正常。

代码语言:javascript
复制
@interface NSURLSessionTask (iRemoteWallet)
    @property (nonatomic, weak) id context;
@end

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2016-02-12 09:55:18

我相信我知道这种奇怪行为(至少对我来说)的根源是什么。我将提供一个我在NSURLSessionDataTask 9.2中遇到的iOS示例。

当您尝试使用在类别-myMethod中添加的方法时:您将看到这样的异常:

__NSCFLocalDataTask -myMethod:发送到实例的未识别的选择器

我已经开始挖掘并发现,在运行时隐藏在__NSCFLocalDataTask类后面的NSURLSessionDataTask类只是传递给NSURLSessionDataTask,而不是继承它。这个类继承链是__NSCFLocalDataTask:__NSCFLocalSessionTask:__NSCFURLSessionTask : NSObject。所以我的分类根本不适用于这个类。怪不得它还没被认出来。

解决这一问题的一个解决方案可能是将您的类别移到NSObject并进行大量的检查。我就是这样做的:

代码语言:javascript
复制
if ([self respondsToSelector:@selector(response)]) {
    id response = [self performSelector:@selector(response)];

    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {

        return [NSString stringWithFormat:@"%td", ((NSHTTPURLResponse *)response).statusCode];

    }

}

NSException *e =[NSException exceptionWithName:NSInternalInconsistencyException reason:@"errorCode: method should be only used on classes that implement -(NSHTTPURLResponse *)response: method." userInfo:nil];

@throw e;

丑?是!但现在起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24448936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档