Objective-C Runtime: cách tốt nhất để kiểm tra xem lớp có tuân thủ giao thức không?


171

Tôi có một Class (nhưng không có ví dụ) và cần biết nó có phù hợp với một giao thức nhất định không. Tuy nhiên, Class có thể được phân lớp nhiều lần và class_conformsToProtocol () bỏ qua các giao thức được khai báo trên các siêu lớp.

Tôi chỉ có thể sử dụng class_getSuperclass () và kiểm tra đệ quy tất cả các lớp trong hệ thống phân cấp trở lên cho đến khi siêu lớp không. Tuy nhiên, tôi tự hỏi nếu điều đó có thể không hiệu quả đối với các hệ thống phân cấp lớp được lồng sâu, và có thể có một cách tốt hơn để làm điều đó?

Nói cách khác, phương thức NSObject tuân thủ ToProtocol được triển khai tốt nhất bằng cách sử dụng các phương thức thời gian chạy Objective-C để nó tìm thấy các giao thức trên các siêu lớp?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Nếu tôi đang đi đúng hướng với đệ quy đi lên hệ thống phân cấp lớp, hãy cho tôi biết.

Câu trả lời:


309

Theo các tài liệu ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

nên làm việc.


4
Bạn đúng. Nó đã bị trễ và không có đề xuất hoàn thành mã nào được Xcode đưa ra. Tôi đã kiểm tra định nghĩa của Class và thấy rằng đó là "typedef struct objc_ class * Class" Tôi đã không kiểm tra tham chiếu lớp NSObject.
LearnCocos2D

Có cách nào để làm điều đó trên một ví dụ thay vì một lớp không? My self.delegatethực hiện nhiều giao thức và tôi muốn kiểm tra xem nó có phù hợp với các giao thức khác không.
Konrad Piascik

@KonradPiascik Chỉ cần gọi nó vào ví dụ : [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah

3

Hoặc, trong trường hợp đó là một con trỏ chung, như:

Class<MyProtocol> someClassPointer = nil;

bạn có thể dùng:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.