Objective-C Runtime: วิธีที่ดีที่สุดในการตรวจสอบว่า class สอดคล้องกับโปรโตคอลหรือไม่?


171

ฉันมีคลาส (แต่ไม่มีอินสแตนซ์) และจำเป็นต้องทราบว่าเป็นไปตามโปรโตคอลที่แน่นอนหรือไม่ อย่างไรก็ตาม Class สามารถ subclassed ได้หลายครั้งและ class_conformsToProtocol () จะไม่สนใจโปรโตคอลที่ประกาศบนซูเปอร์คลาส

ฉันสามารถใช้ class_getSuperclass () และตรวจสอบคลาสทั้งหมดซ้ำในลำดับชั้นขึ้นไปจนกระทั่งซูเปอร์คลาสนั้นเป็นศูนย์ อย่างไรก็ตามฉันสงสัยว่ามันอาจจะไม่มีประสิทธิภาพสำหรับชั้นเรียนที่ซ้อนกันอย่างลึกล้ำและอาจมีวิธีที่ดีกว่าในการทำเช่นนั้น?

กล่าวอีกนัยหนึ่งวิธีการของ NSObject นั้นสอดคล้องกับ ToProtocol อย่างไรที่ใช้งานได้ดีที่สุดโดยใช้วิธีการทำงานแบบ Objective-C เพื่อที่จะหาโปรโตคอลบนซูเปอร์คลาส

 [myObject conformsToProtocol:@protocol(MyProtocol)];

ถ้าฉันอยู่ในเส้นทางที่ถูกต้องและมีลำดับชั้นของคลาสแบบเรียกซ้ำแจ้งให้ฉันทราบ

คำตอบ:


309

ตามเอกสาร ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

ควรทำงาน.


4
คุณถูก. มันช้าและไม่มีคำแนะนำในการเติมโค้ดให้เสร็จสิ้นโดย Xcode ฉันตรวจสอบคำจำกัดความของ Class และเห็นว่ามันเป็น "typedef struct objc_class * Class" ฉันไม่ได้ตรวจสอบการอ้างอิงระดับ NSObject
LearnCocos2D

มีวิธีใดบ้างที่จะทำกับอินสแตนซ์แทนที่จะเป็นคลาส? ฉันself.delegateใช้โปรโตคอลหลายโปรโตคอลและฉันต้องการตรวจสอบว่ามันสอดคล้องกับผู้อื่นหรือไม่
Konrad Piascik

@KonradPiascik เพียงเรียกมันว่าบนอินสแตนซ์แทน: [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah

3

หรือในกรณีที่เป็นตัวชี้ทั่วไปเช่น:

Class<MyProtocol> someClassPointer = nil;

คุณสามารถใช้ได้:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.