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_copyMethodList
的 cls
,获取所有的类方法。
网友评论