Saya tahu cara membuat SEL
waktu kompilasi menggunakan @selector(MyMethodName:)
tetapi yang ingin saya lakukan adalah membuat selektor secara dinamis dari file NSString
. Apakah ini mungkin?
Apa yang saya bisa lakukan:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
Yang ingin saya lakukan: (pseudo code, ini jelas tidak berfungsi)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
Saya telah mencari dokumen Apple API, tetapi belum menemukan cara yang tidak bergantung pada @selector(myTarget:)
sintaks waktu kompilasi .
objective-c
cocoa
dynamic
craigb.dll
sumber
sumber
Menurut dokumentasi XCode, psuedocode Anda pada dasarnya sudah benar.
setWidthHeight = NSSelectorFromString(aBuffer);
Edit: Nyebelin, terlalu lambat. : P
sumber
NSStringFromSelector(@"doWork")
mengubahnya dengan cara lain (hanya fyi)Saya harus mengatakan bahwa ini sedikit lebih rumit daripada yang mungkin disarankan oleh jawaban responden sebelumnya ... jika Anda memang benar-benar ingin membuat pemilih ... bukan hanya "panggil satu" yang "Anda miliki" .. .
Anda perlu membuat penunjuk fungsi yang akan dipanggil oleh metode "baru" Anda .. jadi untuk metode seperti
[self theMethod:(id)methodArg];
, Anda akan menulis ...lalu Anda perlu membuat
IMP
blok secara dinamis, kali ini, meneruskan, "self", theSEL
, dan argumen apa pun ...dan menambahkannya ke kelas Anda, bersama dengan tanda tangan metode yang akurat untuk seluruh pengisap (dalam kasus ini
"v@:@"
, void return, pemanggil objek, argumen objek)Anda dapat melihat beberapa contoh bagus dari jenis runtime shenanigans ini , di salah satu repo saya, di sini.
sumber
Saya tahu ini telah dijawab sejak lama, tetapi saya tetap ingin berbagi. Ini bisa dilakukan dengan menggunakan
sel_registerName
juga.Kode contoh dalam pertanyaan dapat ditulis ulang seperti ini:
sumber
NSSelectorFromString
disebutkan oleh @ torsten-marek menggunakan disel_registerName
bawah tenda. appledev : "NSSelectorFromString meneruskan representasi karakter berenkode UTF-8 dari aSelectorName ke sel_registerName dan mengembalikan nilai yang dikembalikan oleh fungsi itu"