Objective-C Runtime: cara terbaik untuk memeriksa apakah kelas sesuai dengan protokol?

172

Saya memiliki Kelas (tetapi tidak ada instance) dan perlu tahu apakah itu sesuai dengan protokol tertentu. Namun, Kelas dapat disubklasifikasikan beberapa kali dan class_conformsToProtocol () mengabaikan protokol yang dideklarasikan pada superclasses.

Saya hanya bisa menggunakan class_getSuperclass () dan secara rekursif memeriksa semua kelas dalam hierarki ke atas sampai superclass nil. Namun saya bertanya-tanya apakah itu mungkin tidak efisien untuk hierarki kelas yang sangat bersarang, dan mungkin ada cara yang lebih baik untuk melakukan itu?

Dengan kata lain, bagaimana metode NSObject conformTToProtocol terbaik diimplementasikan menggunakan metode runtime Objective-C sehingga menemukan protokol pada superclasses?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Jika saya berada di jalur yang benar dengan secara hirarki naik kelas, beri tahu saya.

LearnCocos2D
sumber

Jawaban:

309

Menurut dokumen ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

harus bekerja.

Wevah
sumber
4
Kamu benar. Sudah terlambat dan tidak ada saran penyelesaian kode yang dibuat oleh Xcode. Saya memeriksa definisi Kelas dan melihat bahwa itu "typedef struct objc_class * Class" Saya tidak memeriksa referensi kelas NSObject.
LearnCocos2D
Apakah ada cara untuk melakukannya pada instance bukan kelas? Saya self.delegatemengimplementasikan beberapa protokol dan saya ingin memeriksa apakah itu sesuai dengan yang lain daripada kelasnya.
Konrad Piascik
@KonradPiascik Sebut saja pada contoh sebagai gantinya: [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah
3

Atau, jika itu adalah pointer umum, seperti:

Class<MyProtocol> someClassPointer = nil;

kamu bisa memakai:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
Nikita
sumber