Apa arti id?

97

Saya (mencoba) mempelajari Objective-C dan saya terus menemukan ungkapan seperti:

-(id) init;

Dan saya mengerti idadalah kata kunci bahasa Objective C, tapi apa artinya mengatakan "compiler secara khusus memperlakukan iddalam hal aturan konversi tipe pointer"?

Apakah idsecara otomatis menunjuk objek di sebelah kanannya sebagai penunjuk?

GPP
sumber
28
Ini kebalikan dari ego. Untuk beberapa orang ituvoid*
Hot Licks
Berikut ini adalah pembahasan yang relevan dengan pertanyaan: SO pertanyaan
dmitri

Jawaban:

122

idadalah penunjuk ke tipe apa pun, tetapi tidak seperti void *itu selalu menunjuk ke objek Objective-C. Misalnya, Anda dapat menambahkan jenis apa pun idke NSArray, tetapi objek tersebut harus merespons retaindan release.

Kompiler sangat senang jika Anda secara implisit mentransmisikan objek apa pun ke id, dan untuk Anda mentransmisikan idke objek apa pun. Ini tidak seperti pengecoran implisit lainnya di Objective-C, dan merupakan dasar untuk sebagian besar jenis wadah di Kakao.

joerick
sumber
11
Suplemen: id definisi typedef struct objc_object *id;, jadi penunjuk ke Objcobjek.
zhongwuzw
itu sama dengan NSObject? Artinya, dapatkah saya mengganti iddengan NSObjectsaat itu adalah tipe pengembalian?
ThunderWiring
33

idadalah penunjuk ke objek Objective-C apa pun ( objc_object). Ini bukan hanya penunjuk kosong dan Anda tidak harus memperlakukannya seperti itu. Ini mereferensikan objek yang harus memiliki isapenunjuk yang valid . Nilai yang dapat disimpan idjuga tidak hanya terbatas pada NSObjectdan turunannya, yang mulai memahami keberadaan NSObjectprotokol serta NSProxykelas yang bahkan tidak mewarisi NSObject. Kompiler akan mengizinkan Anda untuk menetapkan sebuah objek yang direferensikan berdasarkan tipe idke tipe objek apa pun, menetapkan tipe objek apa pun id, serta mengirimkannya pesan apa pun (yang telah dilihat kompiler) tanpa peringatan.

Joe
sumber
25

idadalah tipe generik. Ini berarti bahwa kompilator akan mengharapkan tipe objek apapun disana, dan tidak akan memberlakukan batasan. Ini bisa berguna jika Anda mengharapkan untuk menggunakan lebih dari satu kelas objek di sana; Anda kemudian dapat menggunakan introspeksi untuk mencari tahu kelas itu.idsecara otomatis mengasumsikan pointer, karena semua objek di Objective-C diteruskan sebagai pointer / referensi.

Beberapa Sumber Tambahan:
id vs NSObject vs id *
Pemrograman Objective-C (Wikibooks)
Introspeksi
Pengetikan Dinamis

FeifanZ
sumber
9
  • id adalah tipe data pengidentifikasi objek di Objective-C, yang dapat digunakan untuk objek jenis apa pun tidak peduli kelas apa yang dimilikinya. id adalah tipe super terakhir dari semua objek.

Di java atau c # kami menggunakan seperti ini

 Object data = someValue;


 String name =(Object)data;

tetapi dalam tujuan c

id data= someValue;



NSString *name= data;
chancyWu
sumber
5

Iya dan tidak. Memang benar bahwa memiliki id xmenunjuk x sebagai pointer, tetapi mengatakan bahwa aturan konversi tipe pointer berlaku salah, karena "id" memiliki aturan konversi tipe khusus. Misalnya, dengan void *penunjuk Anda tidak dapat melakukan ini:

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

Sebaliknya, itu mungkin dengan id:

id x;
NSString *y = x;

Lihat lebih banyak penggunaan tipe id dalam contoh tujuan c .

Sebagai tambahan dalam Objective C "modern", lebih disukai untuk menggunakan instancetypemetode "id" pada "init". Bahkan ada alat konversi otomatis di Xcode untuk mengubahnya. Baca tentang instancetype: Apakah bermanfaat untuk mulai menggunakan instancetype daripada id?

battlmonstr
sumber