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

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

作者: 想吃小馄饨啊 | 来源:发表于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是获取的类方法
    先写这么多吧,有时间在改。时间紧,有写错的请多多指教

    相关文章

      网友评论

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

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