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>
fonte
2013-12-13 13:19:41
Utile http://stackoverflow.com/questions/466777/whats-the-difference-between-declaring-a-variable-id- and-nsobject – Maulik
Questo non è un duplicato, perché "' id' vs 'NSObject *' "e" 'id vs NSObject *" 'sono domande significativamente diverse. Votazione per riaprire. –
Martin ha ragione, non è la stessa cosa. – Boon