2010-10-15 15 views
16

Jaka jest różnica między metodą prywatną a interfejsem prywatnym? Na przykład wiem, że jeśli zdefiniujesz metodę w implementacji i jej interfejs nie wymieni tego, jest to metoda prywatna. Widziałem również takie rzeczy jak:Interfejs prywatny a metoda prywatna - cel c

@interface Collector() 
@property (readonly) NSMutableDictionary *count; 
@end 

Wewnątrz pliku .m wdrożenia.

Odpowiedz

20

tworzy rozszerzenie klasy (I stand corrected, props to bbum) na interfejsie Foo, który jest jak dodatkowe metody dodane do interfejsu. Niektórzy używają także @interafce Foo(Private) (kategoria) zamiast rozszerzenia klasy z (). To bardziej przypomina "wstrzykiwanie" nowych metod do klasy spoza klasy.

Umieszczenie tego w pliku .m powoduje, że inne rzeczy nie "widzą" w pliku .h, ale to wszystko. Zasadniczo ludzie zwykle używają rozszerzeń kategorii lub klasy w plikach .m, aby określić prywatne interfejsy, ale są również używane do takich rzeczy, jak UIKit używa kategorii, aby dodać publiczne metody do NSIndexPath. (Może to być mylące.)

Tak naprawdę nie musisz definiować prywatnych metod w ten sposób, ale jeśli masz metodę o nazwie bar, która wywołuje metodę foo, zanim foo zostanie zdefiniowane w pliku źródłowym, otrzymasz kompilator ostrzeżenie typu "obiekt własny może nie odpowiadać na foo". Możesz się tego pozbyć, definiując foo przed zdefiniowaniem paska lub innego kodu wywołującego foo. To samo dotyczy zwykłego C i funkcji.

Tak jak Ole mówi, to nie powstrzymuje nikogo przed wywołaniem prywatnych metod, po prostu deklaruje intencję, że są prywatne i powoduje, że kompilator generuje ostrzeżenia "nie odpowiadaj", nawet jeśli importują plik .h .

EDIT

zobaczyć również http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ jakiegoś wyjaśnienia kategoriach vs. rozszerzeń klasowych. Wygląda na to, że rozszerzenia klas powinny być bardziej poprawne do definiowania prywatnych metod, z perspektywy ostrzeżenia kompilatora, ponieważ metody kategorii są opcjonalne. Chciałbym, żeby moja książka to wytłumaczyła!

+8

Istnieje ogromna różnica między nazwanymi kategoriami '(foo)' i rozszerzeniem klasy '()'. – bbum

+0

Czy masz odniesienie do tego? Nie widzę niczego w książce "Programowanie w Objective-C 2.0" na ten temat. Wygląda na to, że nazwa kategorii jest opcjonalna ze wszystkiego, co mogę powiedzieć. Nie, że jestem głównym ekspertem lub kimkolwiek innym, ale byłoby pomocne, gdybyś mógł podać link wyjaśniający różnicę między (Prywatne) i(). – Nimrod

+0

nevermind, wydaje mi się, że znalazłem Twojego bloga http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ Zastanawiam się, dlaczego moja książka o tym nie mówi? – Nimrod

17

Objective-C nie ma całkowicie prywatnych metod. Metoda zadeklarowana w sekcji interfejsu prywatnego w pliku .m to niewidzialna dla osób dzwoniących z zewnątrz, ale nie jest prywatna. Jeśli ktoś zna sygnaturę metody i ignoruje ostrzeżenie kompilatora, może wywołać ją z zewnątrz bez problemów.

Powiązane problemy