Runtime相关函数 class_copyMethodList

class_copyMethodList

// 获取一个类的所有方法
OBJC_EXPORT Method _Nonnull * _Nullable
class_copyMethodList(Class _Nullable cls, unsigned int * _Nullable outCount) 

cls: class
outCount :返回类中方法的个数
Method:返回包含所有方法的数组

实现一个类,定义属性,成员变量,实例方法,类方法:如下

#import "LoadFunction.h"

@interface LoadFunction ()
{
    NSString * _str; // 成员变量
}

// 属性
@property (nonatomic , copy) NSString *url;

@end

@implementation LoadFunction
// 类方法
+(void)load {
    NSLog(@"你好,宝贝");
}
+ (void)dog{
    NSLog(@"我是LoadFunction的中的go方法");
}
// 实例方法
- (void)big{
    
}
- (void)getStr{
    
}

@end

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

// 获取LoadFunction类的所有实例方法
- (void)getAllInstanceMothed {
    unsigned int count; // 1
    Method *methods = class_copyMethodList([LoadFunction class], &count); // 2
    for (int i = 0; i < count; i++) { // 3
        NSLog(@"---%s", sel_getName(method_getName(methods[i]))); // 4
    } // 5
    free(methods); // 6
}
 TestLoadFunction[5711:237419] ---big //定义的实例方法
 TestLoadFunction[5711:237419] ---getStr // 定义的实例方法
 TestLoadFunction[5711:237419] ---.cxx_destruct
 TestLoadFunction[5711:237419] ---url // 属性url 的 get方法
 TestLoadFunction[5711:237419] ---setUrl // 属性url 的set方法

从上面我看可以得到如下结论:

  • 传入当前类LoadFunction,通过class_copyMethodList获取的都是这个类的实例方法,类方法没有获取到。
  • 成员变量是不会实现 get 和 set 方法的

获取一个类的所有类方法

- (void)getAllClassMothed {
    unsigned int count; // 1
    Class metaClass = object_getClass([LoadFunction class]); // 2 获取元类
    Method *methods = class_copyMethodList(metaClass, &count); // 3
    for (int i = 0; i < count; i++) { // 4
        NSLog(@"%s", sel_getName(method_getName(methods[i]))); // 5
    } // 6
    free(methods); // 7
}
TestLoadFunction[5909:253813] load
TestLoadFunction[5909:253813] dog

获取元类的函数是object_getClass,通过此方法获取元类,将元类当作class_copyMethodListcls,获取所有的类方法。

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

推荐阅读更多精彩内容