[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 <objc/message.h>
我对反射目前理解还不是很深,我觉得主要好处有:
1. 可以根据类的字符串名字获取class,然后获取对象,可以用于对菜单动态配置
2. 在调用方法之前可以先判断是否实现了指定方法,实现了才调用,避免了无谓的crash
3. 判断实例是否属于某个类或者他的子类等,可以用于强制转换
4. 在调用协议方法之前先判断是否实现了此协议,可避免crash
以后有了好的理解之后在补充,先记录下,方便后面查阅