Wiem, że dyrektywa dla protokołu jest @ protokolem, podobnie jak @selector, ale jaki jest "typ" dla odniesienia do protokołu (np. SEL dla @Selektora)? W stosie MacOSX jest to protokół *?Jak odwołać się do protokołu w Objective-C?
Odpowiedz
się odwoływać jako:
id<TheNameOfTheProtocol> aVariableToThatProtocol;
Albo czy wiadomość chce (Protocol *)
obiektu:
[myObject conformsToProtocol:@protocol(TheNameOfTheProtocol)];
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.
To taka sama jak na OS X:
Protocol * p = objc_getProtocol("UITableViewDataSource");
To zadeklarowane w <objc/runtime.h>
:
typedef struct objc_object Protocol;
- 1. Składnia ObjectiveC do określania nazwy protokołu w argumencie Metoda Argumenty
- 2. Jak odwołać się do DLL w web.config?
- 3. Jak odwołać się do zasobu w Javie?
- 4. Jak odwołać się do wielu wersji zespołu
- 5. Jak mogę odwołać się do podprogramu Perl?
- 6. Jak odwołać się do początkowego zatwierdzenia?
- 7. Jak odwołać się do widoku "najwyżej"?
- 8. Jak odwołać się do Microsoft.Office.Interop.Excel dll?
- 9. Wdrożenie ObjectiveC protokół w szybkim
- 10. Jak odwołać się do typu DOMWindow w przeglądarce Google Chrome?
- 11. Jak odwołać się do mockito w ramach tycho?
- 12. Jak odwołać się do stałej w Spring Expression Language
- 13. Jak mogę odwołać się do obrazu w Meteorrze?
- 14. Jak odwołać się do wyrażenia podzielonego w Perlu?
- 15. Jak odwołać się do definicji wiersza/kolumny w Grid.Row/Grid.Column?
- 16. Jak mogę odwołać się do katalogu domowego użytkownika w WIX
- 17. Jak odwołać się do podformularza w MS Access
- 18. Jak odwołać się do biblioteki ServiceStack w skrypcie Unity C#?
- 19. Jak odwołać się do istniejącego oddziału z problemu w GitHub?
- 20. Jak odwołać się do instancji klasy zewnętrznej w Kotlin?
- 21. Jak mogę odwołać się do typu zagnieżdżonego w Spel?
- 22. Android: Jak odwołać się do strun w definicji łańcucha
- 23. Jak odwołać się do strony zawierającej nawiasy w języku SPARQL
- 24. Jak odwołać się lub "znaleźć" PreferenceActivity?
- 25. Jak odwołać się do CSS z bibliotek zainstalowanych przez npm?
- 26. jak odwołać się do natywnego DLL z repo Maven?
- 27. Jak odwołać się do pliku JScript z innego?
- 28. Jak odwołać się do innej kolekcji przy wstawianiu?
- 29. knitr: jak odwołać się do wykresu z wieloplotowego kawałka
- 30. Jak mogę odwołać się do katalogu Jenkinsfile z Pipeline?
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
@ 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 '. –
@ 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