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

今天终于抽出时间复习一下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是获取的类方法
先写这么多吧,有时间在改。时间紧,有写错的请多多指教

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 获取Git仓库 获取Git仓库的方式主要分为两种。第一种是在现有项目或目录下导入所有文件到 Git 中;第二种是从...
    louduanxiong阅读 1,406评论 0 0
  • 这本书告诉我从故事中找寻你自己,人生中你所得到第一份礼物乐观的态度,无忧的开心,礼物是把握时刻得到和珍惜你每天的东...
    e9c27517a4d5阅读 364评论 0 0
  • 原以为,和以前所有中秋节一样,平常得像过活的每一天一样,日升日落,就是一天。在这一天里,经历了些什么,感受了些什么...
    张琮楠阅读 241评论 0 0