2013-12-13 13 views
6

W Objective-C, id<protocol> or NSObject<protocol> są często używane do deklaracji delegatów.Różnica między identyfikatorami <protocol> i NSObject <protocol>

Jakie są główne różnice między id a NSObject? Kiedy chcesz używać jednego kontra drugiego?

+0

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

+2

Nie jest to duplikat, ponieważ "' id' kontra 'NSObject *' "i" 'id " w porównaniu z NSObject * "" są znacząco różne. Głosowanie w celu ponownego otwarcia. –

+0

Martin ma rację, to nie to samo. – Boon

Odpowiedz

8

id<protocol> obj jest deklaracją dla dowolnego obiektu zgodnego z określonym protokołem. Możesz wysłać dowolną wiadomość z podanego protokołu do obiektu (lub z protokołów , który dziedziczy po <protocol>).

NSObject<protocol> *obj jest zgłoszeniem dla każdego obiektu

  • zgodnego z danym protokołem i
  • pochodzi z NSObject.

Oznacza to, że w tym drugim przypadku można wysyłać żadnych metod z klasy NSObject do obiektu, na przykład

id y = [obj copy]; 

która dałaby błąd kompilatora w pierwszym przypadku.

Druga deklaracja oznacza również, że obj jest zgodny z NSObjectprotokołem. Ale to nie ma znaczenia, jeśli <protocol> pochodzi z protokołem NSObject:

@protocol protocol <NSObject> 
+0

Dzięki Martin. Czy identyfikator jest taki sam funkcjonalnie jak NSObject , jeśli protokół pochodzi z ? – Boon

+0

@Boon: Nie. * "To nie ma znaczenia" * dotyczy tylko ostatniej części odpowiedzi, że zarówno "id " obj' i "NSObject * obj" sugerują, że obiekt jest zgodny z protokołem NSObject. - Być może powinienem usunąć ostatnią część z odpowiedzi, sprawia to, że jest tylko bardziej myląca. –

+0

Mam to, dziękuję. – Boon

Powiązane problemy