2012-01-06 18 views

Odpowiedz

13

się odwoływać jako:

id<TheNameOfTheProtocol> aVariableToThatProtocol; 

Albo czy wiadomość chce (Protocol *) obiektu:

[myObject conformsToProtocol:@protocol(TheNameOfTheProtocol)]; 
+0

prostu ciekawi, każdy powód protokołem "typ" musi być używany z „id ? " Wychodząc z tła C#, nieco łatwiej jest zwizualizować odwołanie do interfejsu, ponieważ właśnie deklaracja jest podobna do odwołania do klasy (np. Protokół IProtocol;). – 5StringRyan

+0

@ 5StringRyan Nie znam rozumowania, ale typ "id" jest typem ogólnym dla dowolnego obiektu, nawet jeśli nie jest to obiekt NSObject. Zaletą tej składni jest to, że pozwala na wiele protokołów. Możesz zrobić coś na wzór 'id ', aby wyrazić, że obiekt jest zgodny z obydwoma protokołami. Lub, jeśli twój protokół nie jest zgodny z NSObject, ale instancja klasy, do której się odwołujesz, możesz wykonać następujące czynności: 'id '. –

+3

@ 5StringRyan typ ma * nie * musi być "id". przykład: 'NSArray * var = [NSArray array];' jest legalne z pewnością czasem przydatne. możesz również napisać 'NSArray * var = [NSArray array];' sooo ... to na pewno dobry sposób na wstrzyknięcie pewnego rodzaju bezpieczeństwa. (przykłady są głupie - demonstrują jedynie składnię) – justin

4

id <YourProtocol> delegate (który jest używany do odwoływania się do protokołu)?

I, o którym mowa jabłko Oficjalna DOC i znalazł prosty przykład odnoszą się do innych protokołów w protokole:

#import "B.h" 

@protocol B; // To break the recursive cycle, you must use the @protocol directive to make a forward reference to the needed protocol instead of importing the interface file where the protocol is defined 

@protocol A 
    - foo:(id <B>)anObject; 
@end 

gdzie protokół B jest zadeklarowana następująco:

#import "A.h" 

@protocol B 
    - bar:(id <A>)anObject; 
@end 

Należy zauważyć, że użycie dyrektywy @protocol w ten sposób informuje kompilator, że B jest protokołem, który zostanie zdefiniowany później. Nie importuje pliku interfejsu, w którym zdefiniowano protokół B.


I here're więcej rzeczy, które chciałbyś wiedzieć o :

Pod wieloma względami są podobne do protokołów definicji klas. Obie deklarują metody, a w czasie wykonywania są reprezentowane przez klasy obiektów według instancji klasy i protokołów według instancji protokołu. Podobnie jak obiekty klasy, obiekty protokołu są tworzone automatycznie na podstawie definicji i deklaracji znalezionych w kodzie źródłowym i są używane przez system środowiska wykonawczego. Nie są one przydzielane i inicjalizowane w kodzie źródłowym programu.

kod źródłowy może odnosić się do obiektu przy użyciu protokołu @protocol() Dyrektywa -the tej dyrektywy, który deklaruje protokołu, z wyjątkiem, że tutaj ma zestaw spływu nawiasach. Nawiasy ująć nazwę protokołu:

Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport); 

To jedyny sposób, że kod źródłowy może wyczarować przedmiot protokołu. W przeciwieństwie do nazwy klasy, nazwa protokołu nie określa obiektu - z wyjątkiem opcji @ prototyp().


A co więcej, jest możliwe, by sprawdzić, czy obiekt jest zgodny z protokołem wysyłając mu conformsToProtocol: wiadomość:

if (! [receiver conformsToProtocol:@protocol(MyXMLSupport)] ) { 
    // Object does not conform to MyXMLSupport protocol 
    // If you are expecting receiver to implement methods declared in the 
    // MyXMLSupport protocol, this is probably an error 
} 

conformsToProtocol: test jest jak testodpowiada za pojedynczą metodę, z tym wyjątkiem, że testuje, czy protokół został przyjęty (i prawdopodobnie wszystkie deklaruje zastosowane metody), a nie tylko to, czy jedna konkretna metoda została wdrożona. Ponieważ sprawdza wszystkie metody w protokole, conformsToProtocol: może być bardziej wydajny niż odpowiadaToSelector:.

conformsToProtocol: test jest również, aby isKindOfClass: testu, z wyjątkiem tego, że testy dla typu na podstawie protokołu, a nie typu na podstawie hierarchii spadkowego.

2

To taka sama jak na OS X:

Protocol * p = objc_getProtocol("UITableViewDataSource"); 

To zadeklarowane w <objc/runtime.h>:

typedef struct objc_object Protocol; 
Powiązane problemy