2011-11-02 14 views
63

ja (stara się) uczyć Objective-C i ciągle napotykając frazy jak:Jakie jest znaczenie identyfikatora?

-(id) init; 

I rozumiem id jest celem kluczowe języka C, ale co to znaczy powiedzieć „kompilator specjalnie traktuje id pod względem reguł konwersji typu wskaźnika "?

Czy obiekt id automatycznie wyznacza obiekt po jego prawej stronie jako wskaźnik?

+20

Jest przeciwieństwem ego. Dla niektórych osób jest to "void *" –

+0

Oto dyskusja dotycząca pytania: [Pytanie SO] (http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype -instead-of-id/14652187 # 14652187) – dmitri

Odpowiedz

79

id jest wskaźnikiem do dowolnego typu, ale w przeciwieństwie do void * zawsze wskazuje obiekt Objective-C. Na przykład można dodać coś typu id do NSArray, ale obiekty te muszą odpowiadać na retain i release.

Kompilator jest całkowicie zadowolony, że można niejawnie rzucić dowolny obiekt na obiekt id, a także, aby rzutować obiekt id na dowolny obiekt. Jest to niepodobne do żadnego innego pośredniego rzutowania w Objective-C i jest podstawą większości typów kontenerów w kakao.

+0

Uzupełnienie: Definicja 'id' to' typedef struct objc_object * id; ', więc jest wskaźnikiem do obiektu' Objc'. – zhongwuzw

17

id to rodzaj ogólny. Oznacza to, że kompilator spodziewa się, że będzie tam znajdował się obiekt o nazwie i nie będzie wymuszał ograniczeń. Może to być użyteczne, jeśli spodziewasz się użyć więcej niż jednej klasy obiektów; możesz następnie użyć introspekcji, aby dowiedzieć się, jaka to klasa. id automatycznie przyjmuje wskaźnik, ponieważ wszystkie obiekty w Objective-C są przekazywane jako wskaźniki/referencje.

dodatkowe zasoby:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing

26

id jest wskaźnik do obiektu Cel C (objc_object). To nie jest tylko pusty wskaźnik i nie powinieneś go traktować w ten sposób. Odwołuje się do obiektu, który powinien mieć prawidłowy wskaźnik isa. Wartości, które mogą być przechowywane w id, również nie ograniczają się tylko do NSObject i ich potomków, co zaczyna rozumieć istnienie protokołu NSObject, a także klasy NSProxy, która nawet nie dziedziczy po NSObject. Kompilator umożliwi przypisanie obiektu, do którego odwołuje się typ id, do dowolnego typu obiektu, przypisanie dowolnego typu obiektu do id, a także wysłanie dowolnej wiadomości (którą widział kompilator) bez ostrzeżenia.

4

Tak i nie. To prawda, że ​​oznaczenie id x oznacza x jako wskaźnik, ale stwierdzenie, że stosowane są reguły konwersji typu wskaźnika, jest nieprawidłowe, ponieważ "id" ma specjalne reguły konwersji typu. Na przykład, z void * wskaźnika nie można to zrobić:

void *x; 
char *y = x; // error, this needs an explicit cast 

Wręcz przeciwnie, jest to możliwe z id:

id x; 
NSString *y = x; 

Zobacz więcej wykorzystania typu id in objective c examples.

Ponadto w "nowoczesnym" Celu C preferowane jest użycie instancetype zamiast "id" w metodach "init". W Xcode jest nawet narzędzie do automatycznej konwersji, które to zmienia. Przeczytaj o instancetype: Would it be beneficial to begin using instancetype instead of id?

3
  • „id” jest to typ danych identyfikatorów obiektów w Objective-C, który może być użyty do obiektu dowolnego typu bez względu na to co to ma klasę. "id" jest ostatecznym super typem wszystkich obiektów.

w Javie lub C# jak używamy tego

Object data = someValue; 


String name =(Object)data; 

ale w Objective C

id data= someValue; 



NSString *name= data;