2012-11-29 3 views
5

Ho questo strano comportamento in cui uno dei metodi della mia categoria viene sovrascritto quando viene eseguito su iPhone 3G con iOs 5.1.Il metodo nascosto NSURL queryParameters può ignorare la categoria

ho questa categoria:

@interface NSURL (queryParameters) 
    - (NSDictionary *) queryParameters; 
@end 

che restituisce un dizionario con chiavi e valori NSString NSArray (parametri multipli con lo stesso nome nel mio url).

Funziona bene tranne sul dispositivo menzionato sopra dove ottengo un NSDictionary con NSString come valori invece del NSArray che mi aspettavo (corrispondente all'ultimo parametro nel mio url).

ho creato un progetto vuoto in cui ho costruito un NSURL manichino e capito che risponde al selettore "queryparameters", e restituisce un NSDictionary con NSString come valori:

NSString *urlString = @"http://dummy.url?foo=bar1&foo=bar2"; 
NSURL *url = [NSURL URLWithString:urlString]; 

NSLog(@"%@", [url respondsToSelector:@selector(queryParameters)][email protected]"YES":@"NO"); 
    // YES 

NSLog(@"%@", [[url performSelector:@selector(queryParameters)] debugDescription]); 
    // { 
    //  foo = bar2; 
    // } 

Così ho 2 domande:

  • Qualcuno sa se questo metodo appartiene alla API privata Apple (o qualsiasi altra cosa)?

EDIT: Secondo questa pagina iOS6-Private-Frameworks, questo "queryparameters" è un metodo non documentato di NSURL (ma questo non spiega il motivo per cui in alcuni casi è stato ignorato).

  • Perché il metodo "privato" ignora questo metodo "privato"?

Nota: Ho finito per rinominare il mio metodo per evitare questa collisione.

+1

È possibile utilizzare [categorie condizionali] (http://stackoverflow.com/questions/11950173/conditional-categories-in-mountain-lion) se lo si desidera. –

risposta

1

Penso che la convenzione qui stabilisca anche il prefisso dei metodi di categoria sulle classi che non sono sotto il vostro controllo per evitare qualsiasi scontro di nomi!