2012-11-29 19 views
5

Ich habe dieses seltsame Verhalten, wo eine meiner Kategorie Methoden überschrieben wird, wenn auf iPhone 3Gs mit iOS 5.1 ausgeführt.NSURL versteckte Methode queryParameters kann Kategorie überschreiben

Ich habe diese Kategorie:

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

, die ein Wörterbuch mit NSString Tasten und NSArray Werte (mehrere Parameter mit demselben Namen in meiner url) zurückgibt.

Es funktioniert gut außer auf dem oben genannten Gerät, wo ich ein NSDictionary mit NSString als Werte anstelle der NSArray ich erwartet (entsprechend letzten Parameter in meiner URL).

Ich habe ein leeres Projekt, wo ich einen Dummy-NSURL konstruiert und herausgefunden, dass es „Query“ zum Wähler reagiert und gebe eine NSDictionary mit NSString als Wert:

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

Ich habe 2 Fragen Also:

  • Weiß jemand, ob diese Methode zu Apple private API (oder irgendetwas anderes) gehört?
  • EDIT: Nach dieser Seite iOS6-Private-Frameworks, diese „Query“ ist eine nicht dokumentierte Methode von NSURL (aber das erklärt nicht, warum in einigen Fällen es überschrieben wurde).

    • Warum wird meine "eigene" Methode von dieser "privaten" Methode außer Kraft gesetzt?
    • Bemerkung: Ich habe meine eigene Methode umbenannt, um diese Kollision zu vermeiden.

    +1

    Sie können [bedingte Kategorien] (http://stackoverflow.com/questions/11950173/conditional-categories-in-mountain-lion) verwenden, wenn Sie dies wünschen. –

    Antwort

    1

    Ich denke, die Konvention hier ist auch, um Ihre Kategorie-Methoden auf Klassen, die nicht unter Ihrer Kontrolle, um Namenkonflikt zu vermeiden!