2012-03-03 19 views
7

Konwencja z kategoriami ma zawierać prefiks podczas rozszerzania klas Apple. Na przykład:Jaka jest konwencja dotycząca prefiksowania kategorii za pomocą magicznych słów?

[string XXDataUsingUTF8]; 

(Tak, to głupi przykład Wystarczy przejść z nim.).

Co jestem mniej jasne jest, co konwencja jest gdy identyfikator zaczyna się od copy, set, init lub new.

Na przykład:

[request setHTTPBodyWithKeyValues: keyValues]; 

Jeśli dodać przedrostek moje, to nie następuje to „ustawiaczy początek ustaw” konwencji.

[request XXSetHTTPBodyWithKeyValues: keyValues]; 

Z drugiej strony, jeśli mogę dodać przedrostek po zbiorze, to już naprawdę prefiks:

[request setXXHTTPBodyWithKeyValues: keyValues]; 

To nie jest strasznie importować z set, ale myślę, że staje się bardziej ważne z init, , itp.

Czy Apple to udokumentowało w dowolnym miejscu? Co jest w powszechnym użyciu?

+2

Nie widziałem żadnych oficjalnych wytycznych na ten temat, ale w interesie nie myli ARC lub statyczny analizator LLVM, lub jakikolwiek inny narzędzia lub ludzie czytający twój kod, wolałbym zachować nienaruszony konwencjonalny prefiks na początku selektora. Osobiście używam podkreślenia w nazwach metod rozszerzenia kategorii, ponieważ "rzeczywiste" metody nigdy nie zawierają jednego, zachowując w ten sposób wyjątkowość "przedrostka". W twoim przykładzie będzie to "setXX_HTTPBodyWithKeyValues:". W metodach nie opartych na konwencjach, które stają się po prostu "XX_myMethodName". – pmdj

+0

Sądzę, że to naprawdę jedyna * praktyczna * odpowiedź, prawda? Dzięki za wskazanie tego, co oczywiste. :) –

+1

Bardzo interesujący punkt! Niektórzy ludzie lubią dodawać swój ciąg "namespace": 'setHTTPBodyWithKeyValues_XX:' który nie jest wcale ładniejszy. –

Odpowiedz

11

Można ustawić rodzinę metodę jawnie w deklaracji interfejsu:

@interface NSObject (StevenFisherCategory) 

- (NSData *)XXCopyDataUsingUTF8 __attribute__((objc_method_family(copy))); 

@end 
+0

To doskonały punkt. Jest to zdecydowanie podejście do używania w przyszłości z Xcode 4.3 i późniejszym przy użyciu LLVM, szczególnie z ARC. –

+1

Świetna odpowiedź. Próbowałem dowiedzieć się, jak uruchomić moją metodę inicjacji wstępnej. '' '__attribute __ ((objc_method_family (init)))' '' zrobił lewę – edelaney05

Powiązane problemy