Runtime 动态加载方法

时间:2023-03-08 22:26:46
动态加载
#import"ViewController.h"
#import"Person.h" @interfaceViewController() @end @implementationViewController - (void)viewDidLoad {
[super viewDidLoad]; // performSelector:动态添加方法
Person*p = [[Person alloc]init]; //动态添加方法
//[p performSelector:@selector(eat)]; //传参
[pperformSelector:@selector(eat:)withObject:@]; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated. } Person.h
#import<Foundation/Foundation.h> @interfacePerson :NSObject @end Person.m
#import"Person.h"
#import<objc/message.h> @implementationPerson //定义函数
//没有返回值,参数(id,SEL)
// void(id,SEL)
voidaaaa(idself,SEL_cmd,idparam1)
{ NSLog(@"调用eat %@ %@ %@",self,NSStringFromSelector(_cmd),param1);
} //默认一个方法都有两个参数,self,_cmd,隐式参数
// self:方法调用者
// _cmd:调用方法的编号 //动态添加方法,首先实现这个resolveInstanceMethod
// resolveInstanceMethod调用:当调用了没有实现的方法没有实现就会调用resolveInstanceMethod
// resolveInstanceMethod作用:就知道哪些方法没有实现,从而动态添加方法
// sel:没有实现方法
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
// NSLog(@"%@",NSStringFromSelector(sel)); //动态添加eat方法 if(sel ==@selector(eat:)) {
/*
cls:给哪个类添加方法
SEL:添加方法的方法编号是什么
IMP:方法实现,函数入口,函数名
types:方法类型
*/
// @:对象:SEL
class_addMethod(self, sel, (IMP)aaaa,"v@:@");//V@:@所代表的意思请查阅官方文档
//处理完
return YES;
}
return[super resolveInstanceMethod:sel];
}
@end

源自小马哥教学视频