2013-12-13 9 views
6

In Objective-C, id<protocol> or NSObject<protocol> vengono spesso utilizzati per la dichiarazione dei delegati.Differenza tra ID <protocol> e NSObject <protocol>

Quali sono le principali differenze tra ID e NSObject? Quando vuoi usarne uno rispetto all'altro?

+0

Utile http://stackoverflow.com/questions/466777/whats-the-difference-between-declaring-a-variable-id- and-nsobject – Maulik

+2

Questo non è un duplicato, perché "' id' vs 'NSObject *' "e" 'id vs NSObject *" 'sono domande significativamente diverse. Votazione per riaprire. –

+0

Martin ha ragione, non è la stessa cosa. – Boon

risposta

8

id<protocol> obj è la dichiarazione per qualsiasi oggetto conforme al protocollo specificato. È possibile inviare qualsiasi messaggio dal protocollo specificato all'oggetto (o dai protocolli ereditati da <protocol>).

NSObject<protocol> *obj è la dichiarazione per qualsiasi oggetto che

  • conforme al protocollo dato e
  • è derivato da NSObject.

Ciò significa che nel secondo caso, è possibile inviare i metodi della classe NSObject all'oggetto, per esempio

id y = [obj copy]; 

che darebbe un errore del compilatore nel primo caso.

La seconda dichiarazione implica anche che obj è conforme al protocollo NSObject. Ma questo non fa differenza se <protocol> è derivato dal protocollo NSObject:

@protocol protocol <NSObject> 
+0

Grazie Martin. Quindi l'ID è lo stesso funzionalmente di NSObject se il protocollo è derivato da ? – Boon

+0

@Boon: No. * "Non fa alcuna differenza" * si applica solo all'ultima parte della risposta, che sia 'id obj' e' NSObject * obj' implicano che l'oggetto è conforme al protocollo NSObject. - Forse dovrei eliminare l'ultima parte dalla risposta, lo rende solo più confuso. –

+0

Capito, grazie. – Boon