美文网首页
获取一个类的所有实例方法

获取一个类的所有实例方法

作者: 想吃小馄饨啊 | 来源:发表于2018-10-09 11:32 被阅读177次

今天终于抽出时间复习一下runtime的知识,先做个笔记吧防止以后再忘了,以后再详细记录下。
先创建一个Person类,设名字和手机号公开,年龄和身份证号私有
.h文件

@interface Person : NSObject
{
    NSString *phone;
}
@property (nonatomic, copy) NSString *name;

- (void)haveHouse;
+ (void)haveCar;

@end

.m文件

@interface Person ()
{
    NSString *idCard;
}
@property (nonatomic) NSInteger age;

@end

@implementation Person

- (void)haveHouse {
    
}
+ (void)haveCar {
    
}
@end

在ViewController中验证

- (void)personTest {
   /**
    Class lenderClass = [Person class];
    获取不到所有类方法(包含h和m文件)
    可以获取到.m中私有实例方法(但不能获取到.h中的实例方法)以及所有property修饰的变量(包含.h和.m中)
    */
   Class lenderClass = [Person class];
   unsigned int num , i;
   //class_copyMethodList  作用是获取一个类的所有实例方法
   Method *methodList = class_copyMethodList(lenderClass, &num);
   for (i = 0; i<num; i++) {
       Method *method = &methodList[i];
       //        NSLog(@"%s",sel_getName(method_getName(methodList[i])));
       NSLog(@"method:%@",NSStringFromSelector(method_getName(*method)));
   }
}

打印结果:

2018-10-09 11:10:41.970717+0800 1204 - TestRunTime[9733:402007] method:haveHouse
2018-10-09 11:10:41.970958+0800 1204 - TestRunTime[9733:402007] method:.cxx_destruct
2018-10-09 11:10:41.971200+0800 1204 - TestRunTime[9733:402007] method:name
2018-10-09 11:10:41.971396+0800 1204 - TestRunTime[9733:402007] method:setName:
2018-10-09 11:10:41.971801+0800 1204 - TestRunTime[9733:402007] method:setAge:
2018-10-09 11:10:41.971973+0800 1204 - TestRunTime[9733:402007] method:age

说明[Person class](使用objc_getClass("Person")相同效果)获取不到所有类方法(包含h和m中的),但是可以获取到.m中实例方法,但不能获取到.h中的实例方法(可以将.m中的实例方法隐藏,保留.h中的实例方法试一下)以及所有property修饰的变量(包含.h和.m中)

若想获取Person中的类方法,则可以使用object_getClass([Person class]),接下来验证一下

/**
     Class lenderClass = object_getClass([Person class])
     可以且只能获取到该类的.m中所有类方法
     */
    Class lenderClass = object_getClass([Person class]);
    unsigned int num , i;
    Method *methodList = class_copyMethodList(lenderClass, &num);
    for (i = 0; i<num; i++) {
        Method *method = &methodList[i];
        //        NSLog(@"%s",sel_getName(method_getName(methodList[i])));
        NSLog(@"method:%@",NSStringFromSelector(method_getName(*method)));
    }

打印结果

2018-10-09 11:25:25.645549+0800 1204 - TestRunTime[9825:410384] method:haveCar

而- (void)haveHouse则没有打印出来,说明object_getClass是获取的类方法
先写这么多吧,有时间在改。时间紧,有写错的请多多指教

相关文章

  • Runtime相关函数 class_copyMethodList

    class_copyMethodList 实现一个类,定义属性,成员变量,实例方法,类方法:如下 获取一个类的所有...

  • 反射

    实体类 反射获取实例 反射获取方法 反射获取属性 补充 testBean.getClasses()返回调用类的所有...

  • 获取一个类的所有实例方法

    今天终于抽出时间复习一下runtime的知识,先做个笔记吧防止以后再忘了,以后再详细记录下。先创建一个Person...

  • Java反射--MonkeyKing

    获取类 获取类中的参数 获取类中的方法 获取构造函数 实例化对选 万能get set方法 测试

  • Objective-C底层面试题总结

    方法的归属问题探索 定一个Person类,定义一个实例方法,一个类方法,并完成实现 获取类的方法并打印出来 获取实...

  • 获得一个类的所有变量和方法

    获取一个类的所有方法 获取一个类的所有变量

  • 第01条 用静态工厂方法代替构造方法

    获取类的实例 对于一个类来说,让使用着获取它自身的一个实例,最常用的方法是提供一个公有的构造方法。 除了公有构造方...

  • runtime 应用

    1. 交换方法 1.1 获取类方法 1.2 获取实例方法 1.3 交换两个方法 实例: 2. 分类添加属性 下面给...

  • 24、初识Class类

    Class类是代表类的类,每个Class类的实例都代表了一个类。 通过一个类的Class实例,可以获取一个类的所有...

  • 继承笔记(极客班)

    继承主要,继承实例变量,属性,类方法,实例方法; 所有的类的基类都是NSObject; 类的浅复制只是创建一个新的...

网友评论

      本文标题:获取一个类的所有实例方法

      本文链接:https://www.haomeiwen.com/subject/dmleaftx.html