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 <objc/message.h>

我对反射目前理解还不是很深,我觉得主要好处有:
1. 可以根据类的字符串名字获取class,然后获取对象,可以用于对菜单动态配置
2. 在调用方法之前可以先判断是否实现了指定方法,实现了才调用,避免了无谓的crash
3. 判断实例是否属于某个类或者他的子类等,可以用于强制转换
4. 在调用协议方法之前先判断是否实现了此协议,可避免crash

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值