I protocolli elencano metodi che possono essere implementati da più classi, non necessariamente legate tra loro da rapporti gerarchici
I protocolli sono quindi svincolati dalle definizioni delle classi e questo consente a qualsiasi classe necessiti determinate funzionalità, di implementare i relativi protocolli.
Es
-(void)chiaveSU:(NSEvent *)theEvent;
-(void)ChiaveGiu:(NSEvent *)theEvent;
Una classe con necessità di gestire degli eventi della tastiera può adottare il protocollo e implementare i suoi metodi.
L‘identità della classe che adotta un protocollo non è di alcun interesse.
Con i protocolli si raggruppano oggetti conformi ad uno stesso protocollo sebbene non abbiano similitudini o rapporti gerarchici
Generalmente due oggetti di tipo diverso possono inviarsi messaggi conoscendo le rispettive interfacce.
Se uno sviluppatore rende disponibile un oggetto senza renderne pubblica l’interfaccia e il nome della classe, diventa impossibile per gli altri sviluppatori creare istanze di tale oggetto (oggetto anonimo)
Per consentire la creazione dell’istanza da parte di altri utilizzatori, lo sviluppatore deve fornire un metodo in grado di ritornare un oggetto usabile, privato della propria identità, cioè senza alcun riferimento ad una classe di appartenenza.
Creata l’istanza, dev’essere possibile sfruttare almeno un metodo (altrimenti l’oggetto oltre che essere anonimo non servirebbe proprio a niente).
Il sottoinsieme di metodi ‘utili’ all’utilizzo dell’oggetto, da parte di chi non ha accesso alla sua interfaccia ,viene identificato attraverso la definizione di un protocollo, cioè un elenco di metodi.
Attraverso l’uso di un protocollo è possibile creare una comunicazione tre più oggetti di natura differente.
Quello che bisogna conoscere affinché la comunicazione avvenga è quale messaggio inviare al destinatario e dove inviarlo. Il protocollo definisce questi due aspetti.
I protocolli permettono di dichiarare un’interfaccia senza identificare la classe.
I protocolli, sebbene siano per molti versi assai simili alle definizioni di classe, in quanto entrambi dichiarano metodi e sono rappresentati a runtime da oggetti,non prevedono alcuna allocazione e tanto meno alcuna inizializzazione.
Gli oggetti protocollo vengono referenziati attraverso la direttiva @protocol( ):
@Protocol *myProtocolRef =
@protocol( MyProtocol );
Per adottare un protocollo occorre specificarne il nome contenuto tra i simboli < e >
ES
@interface MiaClasseName:MiaSuperclasse<MyProtocol>
E’ possibile adottare più di un protocollo nel seguente modo:
@interface MiaClasseName:MiaSuperclasse<MioProtocollo,MioProtocollo2>
Una classe è detta conforme al protocollo se lo adotta oppure se esiste una classe superiore nella gerarchia di appartenenza che lo adotta. E’ possibile verificare se un oggetto è conforme ad un protocollo inviando il messaggio conformsToProtocol
if([objectToVerify conformsToProtocol:
@protocol(MyProtocol)] ) // è conforme...
Esiste anche la funzione respondsTo:Selector per verificare se un oggetto è conforme ad un metodo particolare:
if(objectToVerify respondsToSelector:
@selector(MyMethod)] ) // L‟oggetto è conforme al metodo MyMethod
Può capitare, specialmente trattando progetti molto complessi, che si vengano a creare riferimenti circolari tra protocolli.
Ad esempio, immaginiamo che il protocollo A faccia riferimento al protocollo B e viceversa:
#import “ProtocolB.h” @protocol ProtocolA - methodA:(<B>)anObject; @end ___________________________
— Protocollo B ——-
#import “ProtocolA.h”
@protocol ProtocolB
-methodB:(<A>)anObject;
@end