OC 消息

作者: ChiCoChiCo | 来源:发表于2018-06-18 17:04 被阅读6次

1. 来看一段OC代码

QKTeacher *teacher = [[QKTeacher alloc] init];
[super setName:@"刘邦"];
[teacher greet];

编译后的代码

QKTeacher *teacher = objc_msgSend(objc_getClass("QKTeacher"), @selector(alloc));
teacher = objc_msgSend(teacher, @selector(init));
struct objc_super teachSuper = {teacher,class_getSuperclass(objc_getClass("QKTeacher"))};
objc_msgSendSuper(&teachSuper, @selector(setName:),@"刘邦");
objc_msgSend(teacher, @selector(greet));

动态添加方法

 + (BOOL)resolveClassMethod:(SEL)sel {
    if ([NSStringFromSelector(sel) isEqualToString:@"newMethord:"]) {
        class_addMethod(self, sel, (IMP)newMethord, "v@:@");
    }
    return [super resolveClassMethod:sel];
}
void newMethord(id self, SEL _cmd,NSString *str) {
    NSLog(@"str : %@",str);
}

// 消息调用
 objc_msgSend(tearcher, @selector(newMethord:),@"刘邦");

小结

  1. 对于[QKTeacher alloc]这样的消息,编译时会转化成objc_msgSend()函数
  2. objc_msgSend() 包括消息的发送者,消息的名字,参数。
  3. objc_msgSend() 有两个隐含的参数 id self 和 SEL _comd
  4. [super setName:@"刘邦"] 这样的消息,编译时会转化成 objc_msgSendSuper
  5. objc_msgSendSuper() 包括父类的结构体指针、方法、方法的参数
  6. struct objc_super 这个结构体里边包括子类的实例,子类的父类的名称

2. OC 消息的运行流程

1.转换成objc_msgSend


objc_msgSend

2.查找方法的实现


查找IMP

3.消息转发

1.1 类方法转发前处理 + (BOOL)resolveClassMethod:(SEL)sel;
1.2 实例方法转发前处理+ (BOOL)resolveInstanceMethod:(SEL)sel
2.重定向消息 - (id)forwardingTargetForSelector:(SEL)aSelector
3.消息转发 - (void)forwardInvocation:(NSInvocation *)anInvocation
4.如果都没处理,就会报找不到消息的异常

相关文章

  • OC 消息

    1. 来看一段OC代码 QKTeacher *teacher = [[QKTeacher alloc] init]...

  • iOS runtime

    runtime 是 oc 语音的基础首先runtime的核心机制是消息机制 也就是oc的消息机制首先oc的消息机制...

  • objc_msgSend

    OC中消息的概念 OC中在对象上调用方法,用OC的术语叫“传递消息”。在OC中,如果向某对象传递消息,会使用动态绑...

  • 为什么 Swift 关联类型的协议需要做为泛型约束使用(译)

    一、OC 协议:发消息 OC 的协议本质是消息的集合。例如,UITableViewDataSource 协议有请求...

  • 第 1 条:了解 Objective-C 语言的起源

    OC 语言由 Smalltalk (消息型语言的鼻祖) 演化而来。OC 使用“消息结构”(messaging st...

  • effective oc笔记

    熟悉OC 了解OC的起源oc由smalltalk演化而来,使用’消息结构‘而非函数调用’消息结构‘其所运行时所之行...

  • OC中的消息机制和动态运行时

    消息机制:OC中的实例对象调用一个方法称作消息传递 OC中里的消息传递采用动态绑定机制来决定具体调用哪个方法,OC...

  • iOS消息机制相关

    (1)OC中给nil对象发送消息程序是否会crash? OC向nil发送消息,是不会崩溃的。 OC的函数调用都是通...

  • iOS消息机制相关

    OC中给nil对象发送消息程序是否会crash? OC想nil发送消息,是不会崩溃的。 OC的函数调用都是通过ob...

  • iOS objc_msgSend消息发送机制

    前言: OC的消息机制 objc_msgSend(消息接受者,消息名称) OC中方法的调用,其实都是转换为objc...

网友评论

    本文标题:OC 消息

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