关于runtime的一些简单理解

2016-06-21  本文已影响25人  我勒个去的

1.消息发送
OC:运行时机制,消息机制是运行时机制最重要的机制
消息机制:任何方法调用,本质都是发送消息

SEL:方法编号,根据方法编号就可以找到对应方法实现
Person *p = [[Person alloc] init];
[p performSelector:@selector(eat)];
// 让p发送消息
// objc_msgSend(p, @selector(eat));
// objc_msgSend(p, @selector(run:),10);带参数的消息
这是消息发送的对象方法。

// 获取类对象
Class personClass = [Person class];
[personClass performSelector:@selector(eat)];
// 运行时
objc_msgSend(personClass, @selector(eat));
这是消息发送的类方法。

2.方法交换
// 交换方法实现,方法都是定义在类里面
// class_getMethodImplementation:获取方法实现
// class_getInstanceMethod:获取对象
// class_getClassMethod:获取类方法
// IMP:方法实现

// Class:获取哪个类方法
// SEL:获取方法编号,根据SEL就能去对应的类找方法
Method imageNameMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));

// xmg_imageNamed
Method xmg_imageNamedMethod = class_getClassMethod([UIImage class], @selector(xmg_imageNamed:));

// 交换方法实现
method_exchangeImplementations(imageNameMethod, xmg_imageNamedMethod);

实列:

3.动态添加方法
// performSelector:动态添加方法,声明一个类,并不提供eat:这个方法
Person *p = [[Person alloc] init];
[p performSelector:@selector(eat:) withObject:@111];
在Person类中,
// 动态添加方法,首先实现这个resolveInstanceMethod
// resolveInstanceMethod调用:当调用了没有实现的方法没有实现就会调用resolveInstanceMethod
// resolveInstanceMethod作用:就知道哪些方法没有实现,从而动态添加方法
// sel:没有实现方法

声明一个C语言的函数来动态添加
void aaaa(id self, SEL _cmd, id param1)
{
NSLog(@"调用eat %@ %@ %@",self,NSStringFromSelector(_cmd),param1);
}

4.分类动态添加属性
列如给NSObject添加一个name属性

上一篇 下一篇

猜你喜欢

热点阅读