Object-C之反射

[1] 获取class
主要三种方式

    // 字符串获取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] 动态调用实例方法
两个判断方法:

    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,然后获取对象,可以用于对菜单动态配置
2. 在调用方法之前可以先判断是否实现了指定方法,实现了才调用,避免了无谓的crash
3. 判断实例是否属于某个类或者他的子类等,可以用于强制转换
4. 在调用协议方法之前先判断是否实现了此协议,可避免crash

以后有了好的理解之后在补充,先记录下,方便后面查阅

你可能感兴趣的:(Object-C)