2012-11-29 11 views
5

Mam to dziwne zachowanie, gdy jedna z moich metod kategorii zostaje nadpisana podczas działania na iPhone 3G z iOs 5.1.Metoda ukryta NSURL queryParameters może zastąpić kategorię

mam tej kategorii:

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

zwracającą słownik z kluczami i wartościami NSArray NSString (wielu parametrów z tej samej nazwie w moim URL).

Działa dobrze, z wyjątkiem wyżej wspomnianego urządzenia, gdzie otrzymuję NSDictionary z NSString jako wartości zamiast oczekiwanego NSArray (odpowiadającego ostatniemu parametrowi w moim adresie URL).

stworzyłem pusty projekt gdzie skonstruował atrapę bibliotece NSURL i zorientowali się, że reaguje na przełącznik „queryParameters”, i zwraca NSDictionary z NSString jako wartości:

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

Więc mam 2 pytania:

  • Czy ktoś wie, czy ta metoda należy do Apple private api (lub cokolwiek innego)?

EDIT: Według tej stronie iOS6-Private-Frameworks, to „queryParameters” jest nieudokumentowana metoda bibliotece NSURL (ale to nie wyjaśnia, dlaczego w niektórych przypadkach było przesłonięte).

  • Dlaczego moja "własna" metoda jest nadpisywana przez tę "prywatną" metodę?

Uwaga: Skończyło się na zmianie nazwy własnej metody, aby uniknąć tej kolizji.

+1

Możesz użyć [warunkowe kategorie] (http://stackoverflow.com/questions/11950173/conditional-categories-in-mountain-lion), jeśli sobie tego życzysz. –

Odpowiedz

1

Myślę, że konwencją tutaj jest również przedrostek metod twojej kategorii na zajęciach, które nie są pod twoją kontrolą, aby uniknąć zderzenia nazw!