Object-Cの反射

2566 ワード

[1]classを取得する主な3つの方法
    //  class
    Class clazz = NSClassFromString(@"FKPerson");
    //  class
    clazz = [FKPerson class];
    //  class
    FKPerson *person = [[FKPerson alloc] initWithName:@" "];
    clazz = [person class];
    [[clazz alloc] init];

[2]継承関係をチェックする方法
    //  , person clazz clazz 
    [person isKindOfClass:clazz];
    //  , person clazz clazz 
    [FKPerson isSubclassOfClass:clazz];
    //  , person clazz 
    [person isMemberOfClass:clazz];

[3]インスタンスメソッドを動的に呼び出す2つの判断方法:
    NSLog(@"%d", [[[FKEatable alloc] init] conformsToProtocol:@protocol(FKEatableDelegate)]); //  FKEatableDelegate     
    NSLog(@"%d", [[[FKPerson alloc] init] respondsToSelector:@selector(showInfo)]); //  showInfo 
    [person showInfo]; //  
    [person performSelector:@selector(showInfo) withObject:nil];
    objc_msgSend(person, NSSelectorFromString(@"testWithName:age:gender:"), @" ", 20, @" "); //   #import 

私は反射についてまだ深く理解していません.主なメリットは:1.クラスの文字列名に基づいてclassを取得し、メニューの動的構成に使用できるオブジェクトを取得できます.メソッドを呼び出す前に指定メソッドが実装かどうかを判断し、実装してから呼び出すことができ、無駄なcrash 3を回避することができる.インスタンスがクラスまたはその子クラスに属するか否かを判断することは、強制変換4に用いることができる.プロトコルメソッドを呼び出す前に、crashを回避するために、このプロトコルが実装されているかどうかを判断します.
后で良い理解があった后に补充して、先に记录して、后で调べやすいです