Próbuję (próbuję) nauczyć się Objective-C i ciągle napotykam takie zdanie:
-(id) init;
Rozumiem, że id
jest to słowo kluczowe języka Objective C, ale co to znaczy, że „kompilator traktuje id
w szczególności zasady konwersji typów wskaźników”?
Czy id
automatycznie wyznacza obiekt po prawej stronie jako wskaźnik?
objective-c
types
GPP
źródło
źródło
void*
Odpowiedzi:
id
jest wskaźnikiem do dowolnego typu, ale w przeciwieństwie dovoid *
niego zawsze wskazuje na obiekt Objective-C. Na przykład możesz dodać dowolny typid
do NSArray, ale te obiekty muszą odpowiadać naretain
irelease
.Kompilator jest całkowicie szczęśliwy, że możesz niejawnie rzutować dowolny obiekt na dowolny obiekt
id
i możesz rzutowaćid
na dowolny obiekt. Jest to odmienne od innych niejawnych rzutowań w Objective-C i jest podstawą większości typów kontenerów w kakao.źródło
id
Definicja jesttypedef struct objc_object *id;
, więc wskazuje naObjc
obiekt.NSObject
? Oznacza to, mogę wymienićid
zNSObject
kiedy jest to typ zwracany?id
jest 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łowyisa
wskaźnik. Wartości, w których można przechowywać,id
nie ograniczają się tylko doNSObject
i do jego potomków, co zaczyna nabierać sensu w istnieniuNSObject
protokołu, a takżeNSProxy
klasy, z której nawet nie dziedziczyNSObject
. Kompilator pozwoli Ci przypisać obiekt, do którego odwołuje się typ,id
do dowolnego typu obiektu, przypisać dowolny typ obiektuid
, a także wysłać do niego dowolną wiadomość (którą zobaczył kompilator) bez ostrzeżenia.źródło
id
jest 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.id
automatycznie 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
źródło
W javie lub c # używamy w ten sposób
ale w celu c
źródło
Tak i nie. Prawdą jest, że
id x
wyznaczanie 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ć:Wręcz przeciwnie, z id:
Zobacz więcej zastosowań typu id w obiektywnych przykładach c .
Dodatkowo w "nowoczesnym" celu C preferowane jest używanie
instancetype
zamiast "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?źródło