Objective-cで特定のクラスのすべての子孫クラスのリストを取得することは可能ですか?
何かのようなもの:
@interface A : NSObject
@end
@interface B : A
@end
@interface C : A
@end
NSArray *descendants = [A allDescendants]; // descendants = [B, C]
Objective-cで特定のクラスのすべての子孫クラスのリストを取得することは可能ですか?
何かのようなもの:
@interface A : NSObject
@end
@interface B : A
@end
@interface C : A
@end
NSArray *descendants = [A allDescendants]; // descendants = [B, C]
私が考えることができる唯一の方法は、ランタイムでクラスのリスト全体を列挙し( で取得objc_getClassList)、それぞれをテストすることですisKindOfClass:A。
クラスはその子孫へのリンクを維持しないため (スーパークラスへのリンクのみ)、これがおそらく唯一の解決策です。
例として、 Ken Ferryによる解決策をWil Shipleyのブログ投稿にリンクしています。
基本的に、クラスを歩きます。
どういうわけかクラスのメンバーを使ってもらえますか?呼び出すと、selfのスーパークラスのクラス[[A class] superclass]のインスタンスが返されます。Classクラスの名前はそのクラスから取得できると思いますClass-それはあなたが望むことをしますか?
これは実際にはプロトコルをまったく処理しませんが、少なくともこれは正しい方向を示すでしょう。