Saya (mencoba) mempelajari Objective-C dan saya terus menemukan ungkapan seperti:
-(id) init;
Dan saya mengerti id
adalah kata kunci bahasa Objective C, tapi apa artinya mengatakan "compiler secara khusus memperlakukan id
dalam hal aturan konversi tipe pointer"?
Apakah id
secara otomatis menunjuk objek di sebelah kanannya sebagai penunjuk?
objective-c
types
GPP
sumber
sumber
void*
Jawaban:
id
adalah penunjuk ke tipe apa pun, tetapi tidak sepertivoid *
itu selalu menunjuk ke objek Objective-C. Misalnya, Anda dapat menambahkan jenis apa punid
ke NSArray, tetapi objek tersebut harus meresponsretain
danrelease
.Kompiler sangat senang jika Anda secara implisit mentransmisikan objek apa pun ke
id
, dan untuk Anda mentransmisikanid
ke objek apa pun. Ini tidak seperti pengecoran implisit lainnya di Objective-C, dan merupakan dasar untuk sebagian besar jenis wadah di Kakao.sumber
id
definisitypedef struct objc_object *id;
, jadi penunjuk keObjc
objek.NSObject
? Artinya, dapatkah saya menggantiid
denganNSObject
saat itu adalah tipe pengembalian?id
adalah 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 memilikiisa
penunjuk yang valid . Nilai yang dapat disimpanid
juga tidak hanya terbatas padaNSObject
dan turunannya, yang mulai memahami keberadaanNSObject
protokol sertaNSProxy
kelas yang bahkan tidak mewarisiNSObject
. Kompiler akan mengizinkan Anda untuk menetapkan sebuah objek yang direferensikan berdasarkan tipeid
ke tipe objek apa pun, menetapkan tipe objek apa punid
, serta mengirimkannya pesan apa pun (yang telah dilihat kompiler) tanpa peringatan.sumber
id
adalah 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.id
secara 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
sumber
Di java atau c # kami menggunakan seperti ini
tetapi dalam tujuan c
sumber
Iya dan tidak. Memang benar bahwa memiliki
id x
menunjuk x sebagai pointer, tetapi mengatakan bahwa aturan konversi tipe pointer berlaku salah, karena "id" memiliki aturan konversi tipe khusus. Misalnya, denganvoid *
penunjuk Anda tidak dapat melakukan ini:Sebaliknya, itu mungkin dengan id:
Lihat lebih banyak penggunaan tipe id dalam contoh tujuan c .
Sebagai tambahan dalam Objective C "modern", lebih disukai untuk menggunakan
instancetype
metode "id" pada "init". Bahkan ada alat konversi otomatis di Xcode untuk mengubahnya. Baca tentang instancetype: Apakah bermanfaat untuk mulai menggunakan instancetype daripada id?sumber