2014-06-27 8 views
5

Devo aggiungere il metodo a NSURLSessionTask. Ecco la mia categoria che si suppone per farlo:Il metodo della categoria NSURLSessionTask si arresta in modo anomalo con "Selettore non riconosciuto inviato all'istanza"

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

Tutto compila bene, opere di completamento automatico, ma quando chiamo questo metodo, la mia domanda si blocca:

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' 

Stesso approccio funziona se aggiungo categoria NSObject, e non riesco a capire perché non lo fa per NSURLSessionTask.

Ecco un progetto di test che riproduce questo problema per me: https://dl.dropboxusercontent.com/u/25100182/Test.zip

risposta

4

Purtroppo non sembra che NSURLSession in grado di supportare le categorie. Ho avuto un problema simile cercando di aggiungere un oggetto associato.
Vedere anche here.

+0

Grazie per il puntatore, proverò ciò che suggerisci. A proposito, pensi che questo problema sia menzionato da qualche parte nei documenti? –

+0

No, non ho ancora capito se si tratta di un bug o di una "funzionalità" – Andrea

4

Ho riscontrato un problema simile nella categoria NSURLSessionDataTask, quando ho ridotto l'ambito a NSURLSessionTask, sembra che funzioni correttamente.

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

Spero che questo aiuti.

1

Credo di sapere qual è l'origine di questo comportamento piuttosto strano (almeno per me). Fornirò un esempio che ho riscontrato con NSURLSessionDataTask in iOS 9.2.

Quando si tenta di utilizzare il metodo che hai aggiunto in una categoria -myMethod: si vedrà un'eccezione in questo modo:

[__NSCFLocalDataTask -myMethod]: selettore non riconosciuto inviato a esempio

ho iniziato a scavare e ha scoperto che __NSCFLocalDataTask classe che si nasconde dietro il nostro NSURLSessionDataTask classe in fase di esecuzione è solo colato a NSURLSessio nDataTask ma non eredita da esso. Questa catena di ereditarietà di classe è __NSCFLocalDataTask: __NSCFLocalSessionTask: __NSCFURLSessionTask: NSObject. Quindi la mia categoria non si applica a questa classe. Non c'è da stupirsi che non sia riconosciuto.

Una soluzione potrebbe essere quella di spostare la categoria su NSObject e fare un po 'di controllo. L'ho fatto così:

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; 

Brutto? Sì! Ma funziona per ora.