iOS:在运行时没有找到NSURLSession类别方法

我想在NSURLSession上创建一个类别.该应用程序编译好,但是当我尝试调用我得到的类别方法
-[__NSCFURLSession doSomething]: unrecognized selector sent to instance 0xbf6b0f0
<unknown>:0: error: -[NSURLSession_UPnPTests testCategory] : -[__NSCFURLSession doSomething]: unrecognized selector sent to instance 0xbf6b0f0

很奇怪,这里是我建立的一个测试类来显示问题. NSString上的类别工作正常,但NSURLSession上的类别在运行时无法找到该方法.我怀疑这是内在的东西.

意见:-)

#import <XCTest/XCTest.h>

@interface NSString (test)
-(void) doSomethingHere;
@end

@implementation NSString (test)
-(void) doSomethingHere {
    NSLog(@"Hello string");
}
@end

@interface NSURLSession (test)
-(void) doSomething;
@end

@implementation NSURLSession (test)
-(void) doSomething {
    NSLog(@"Hello!!!!");
}
@end

@interface NSURLSession_UPnPTests : XCTestCase
@end

@implementation NSURLSession_UPnPTests
-(void) testCategory {
    [@"abc" doSomethingHere];
    NSURLSession *session = [NSURLSession sharedSession];
    [session doSomething];
}
@end

解决方法

我已经得到了与NSURLSessionUploadTasks相似的结果,它们在-URLSession期间被反序列化为__NSCFURLSessionUploadTasks:task:didCompleteWithError:delegate callback.

如果我是你,我会放弃这种方法,并使用组合(即使NSURLSession成为另一个对象中的ivar).如果您需要使用NSURLSession存储一些信息,可以将JSON编码的字典填入.sessionDescription.

这是我以前为一个任务做的代码:

#pragma mark - Storing an NSDictionary in NSURLSessionTask.description

// This lets us attach some arbitrary information to a NSURLSessionTask by JSON-encoding
// an NSDictionary,and storing it in the .description field.
//
// Attempts at creating subclasses or categories on NSURLSessionTask have not worked out,// because the –URLSession:task:didCompleteWithError: callback passes an
// __NSCFURLSessionUploadTask as the task argument. This is the best solution I could
// come up with to store arbitray info with a task.

- (void)storeDictionary:(NSDictionary *)dict inDescriptionOfTask:(NSURLSessionTask *)task
{
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];
    NSString *stringRepresentation = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    [task setTaskDescription:stringRepresentation];
    [stringRepresentation release];
}

- (NSDictionary *)retrieveDictionaryFromDescriptionOfTask:(NSURLSessionTask *)task
{
    NSString *desc = [task taskDescription];
    if (![desc length]) {
        DDLogError(@"No description for %@",task);
        return nil;
    }
    NSData *data = [desc dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *dict = (data ? (id)[NSJSONSerialization JSONObjectWithData:data options:0 error:nil] : nil);
    if (!dict) {
        DDLogError(@"Could not parse dictionary from task %@,descriptionn%@",task,desc);
    }
    return dict;
}

以上是来客网为你收集整理的iOS:在运行时没有找到NSURLSession类别方法全部内容,希望文章能够帮你解决iOS:在运行时没有找到NSURLSession类别方法所遇到的程序开发问题。

如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。