Jakie jest znaczenie id?

97

Próbuję (próbuję) nauczyć się Objective-C i ciągle napotykam takie zdanie:

-(id) init;

Rozumiem, że idjest to słowo kluczowe języka Objective C, ale co to znaczy, że „kompilator traktuje idw szczególności zasady konwersji typów wskaźników”?

Czy idautomatycznie wyznacza obiekt po prawej stronie jako wskaźnik?

GPP
źródło
28
To przeciwieństwo ego. Dla niektórych tovoid*
Hot Licks
Oto dyskusja odnosząca się do pytania: Pytanie SO
dmitri

Odpowiedzi:

122

idjest wskaźnikiem do dowolnego typu, ale w przeciwieństwie do void *niego zawsze wskazuje na obiekt Objective-C. Na przykład możesz dodać dowolny typ iddo NSArray, ale te obiekty muszą odpowiadać na retaini release.

Kompilator jest całkowicie szczęśliwy, że możesz niejawnie rzutować dowolny obiekt na dowolny obiekt idi możesz rzutować idna dowolny obiekt. Jest to odmienne od innych niejawnych rzutowań w Objective-C i jest podstawą większości typów kontenerów w kakao.

joerick
źródło
11
Suplement: id Definicja jest typedef struct objc_object *id;, więc wskazuje na Objcobiekt.
zhongwuzw
czy to jest to samo co NSObject? Oznacza to, mogę wymienić idz NSObjectkiedy jest to typ zwracany?
ThunderWiring
Dokument
33

idjest wskaźnikiem do dowolnego obiektu Objective-C ( objc_object). To nie jest zwykły wskaźnik pustki i nie należy go tak traktować. Odwołuje się do obiektu, który powinien mieć prawidłowy isawskaźnik. Wartości, w których można przechowywać, idnie ograniczają się tylko do NSObjecti do jego potomków, co zaczyna nabierać sensu w istnieniu NSObjectprotokołu, a także NSProxyklasy, z której nawet nie dziedziczy NSObject. Kompilator pozwoli Ci przypisać obiekt, do którego odwołuje się typ, iddo dowolnego typu obiektu, przypisać dowolny typ obiektu id, a także wysłać do niego dowolną wiadomość (którą zobaczył kompilator) bez ostrzeżenia.

Joe
źródło
25

idjest typem ogólnym. Oznacza to, że kompilator będzie oczekiwał tam dowolnego typu obiektu i nie będzie wymuszał ograniczeń. Może to być przydatne, jeśli spodziewasz się użyć więcej niż jednej klasy obiektów; możesz następnie użyć introspekcji, aby dowiedzieć się, która to klasa. idautomatycznie przyjmuje wskaźnik, ponieważ wszystkie obiekty w Objective-C są przekazywane jako wskaźniki / referencje.

Niektóre dodatkowe zasoby:
id vs NSObject vs id *
Programowanie Objective-C (Wikibooks)
Introspekcja
Dynamiczne typowanie

FeifanZ
źródło
9
  • id to typ danych identyfikatorów obiektów w Objective-C, których można użyć dla obiektu dowolnego typu, niezależnie od tego, jaką klasę ma. id jest ostatnim nadtypem wszystkich obiektów.

W javie lub c # używamy w ten sposób

 Object data = someValue;


 String name =(Object)data;

ale w celu c

id data= someValue;



NSString *name= data;
chancyWu
źródło
5

Tak i nie. Prawdą jest, że id xwyznaczanie x jako wskaźnika, ale mówienie, że reguły konwersji typu wskaźnika mają zastosowanie, jest błędne, ponieważ „id” ma specjalne reguły konwersji typów. Na przykład za pomocą void *wskaźnika nie możesz tego zrobić:

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

Wręcz przeciwnie, z id:

id x;
NSString *y = x;

Zobacz więcej zastosowań typu id w obiektywnych przykładach c .

Dodatkowo w "nowoczesnym" celu C preferowane jest używanie instancetypezamiast "id" metod "init". W Xcode jest nawet narzędzie do automatycznej konwersji, które to zmienia. Przeczytaj o instancetype: czy warto byłoby zacząć używać instancetype zamiast id?

battlmonstr
źródło