我想在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 %@,description\n%@",task,desc); } return dict; }