2014-06-27 12 views
5

Ich muss Methode zu NSURLSessionTask hinzufügen. Hier ist meine Kategorie, die angeblich das tun:NSURLSessionTask Kategorie Methode stürzt mit "Unbekannter Selektor an Instanz gesendet"

// 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 

Alles kompiliert gut, die automatische Vervollständigung funktioniert, aber wenn ich diese Methode aufrufen, meine Anwendung abstürzt:

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' 

gleiche Ansatz funktioniert, wenn ich hinzufügen Kategorie NSObject, und ich kann nicht verstehen, warum es nicht für NSURLSessionTask.

Hier ist ein Testprojekt, das dieses Problem für mich wiedergibt: https://dl.dropboxusercontent.com/u/25100182/Test.zip

Antwort

4

Leider scheint es nicht, dass NSURLSession Kategorien unterstützt. Ich bin auf ein solches Problem gestoßen, das versucht, ein verbundenes Objekt hinzuzufügen.
Siehe auch here.

+0

Danke für den Zeiger, ich werde versuchen, was Sie vorschlagen. Denken Sie übrigens, dass dieses Problem irgendwo in den Dokumenten erwähnt wird? –

+0

Nein, ich habe immer noch nicht verstanden, ob es ein Fehler oder ein "Feature" ist – Andrea

4

Ich hatte ähnliches Problem bei NSURLSessionDataTask Kategorie, wenn ich den Umfang auf NSURLSessionTask reduziert scheint es richtig zu funktionieren.

@interface NSURLSessionTask (iRemoteWallet) 
    @property (nonatomic, weak) id context; 
@end 

Hoffe das hilft.

1

Ich glaube, ich weiß, was ist der Ursprung dieses ziemlich seltsam (für mich zumindest) Verhalten. Ich werde ein Beispiel, das ich mit NSURLSessionDataTask in iOS 9.2 gefunden habe.

Wenn Sie versuchen, die Methode zu verwenden, die Sie in einer Kategorie -myMethod hinzugefügt haben, werden Sie gleich eine Ausnahme wie diese:

[__NSCFLocalDataTask -myMethod]: Unbekannter Selektor gesendet Instanz

ich zu graben begonnen haben und entdeckt, dass __NSCFLocalDataTask Klasse, die NSURLSessionDataTask Klasse zur Laufzeit hinter unserer versteckt ist nur NSURLSessio zu gegossenem nDataTask aber erbt nicht von ihm. Diese Klasse Vererbungskette ist __NSCFLocalDataTask: __NSCFLocalSessionTask: __NSCFURLSessionTask: NSObject. Also meine Kategorie gilt überhaupt nicht für diese Klasse. Kein Wunder, dass es nicht erkannt wird.

Eine Lösung für dieses Problem könnte sein, Ihre Kategorie nach NSObject zu verschieben und eine Reihe von Prüfungen durchzuführen. Ich habe es so gemacht:

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; 

Hässlich? Ja! Aber es funktioniert für jetzt.