Apakah mungkin untuk membuat instance kelas dengan nama? Sesuatu seperti:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Saya tidak tahu apakah ini mungkin dalam obyektif-c tetapi sepertinya akan,
objective-c
reflection
Menandai
sumber
sumber
NSClassFromString()
menjalankan risiko salah ketik nama kelas atau sebaliknya menggunakan kelas yang tidak ada. Anda tidak akan mengetahuinya sampai runtime jika Anda membuat kesalahan itu. Sebaliknya, jika Anda menggunakan tipe objektif-c bawaanClass
untuk membuat variabel, maka compiler akan memverifikasi bahwa kelas tersebut ada.Misalnya, di
.h
:dan kemudian di
.m
:Jika Anda salah mengetik nama kelas atau jika tidak ada, Anda akan mendapatkan kesalahan pada waktu kompilasi. Juga saya pikir ini adalah kode yang lebih bersih.
sumber
Jika Anda bekerja dengan Objective-C tanpa
NeXTstep
(OS X
,iOS
,GNUstep
dll) sistem atau Anda hanya berpikir metode ini lebih bersih, maka Anda bisa memanfaatkan bahasa Objective-C runtime perpustakaan API . Di bawahObjective-C 2.0
:Di bawah Objective-C (1.0 atau versi tanpa nama) Anda akan menggunakan yang berikut:
Saya belum menguji
1.0
versinya, namun saya telah menggunakan2.0
fungsi dalam kode yang sekarang dalam produksi. Saya pribadi percaya menggunakan2.0
fungsi lebih bersih jika tersedia daripada fungsi NS karena mengkonsumsi lebih sedikit ruang:the length of the name in bytes + 1 ( null terminator )
untuk 2.0 API versusthe sum of two pointers (isa, cstring)
, asize_t length (cstring_length)
, danlength of the string in bytes + 1
untukNeXTSTEP
API.sumber
Kemudian untuk menggunakannya:
sumber