概念
OC是基于C的,为C添加了面向对象的特性,它将许多静态语言编译和链接时做的事放到了runtime中处理,可以说runtime是oc的幕后工作者。
runtime是纯C的API,OC就是在运行时候的一些机制,其中罪主要的是消息机制。
对于C语言,在编译的时候会决定调用哪些函数。OC的函数调用成为消息发送,属于动态调用过程,在编译的时候不决定调用哪些函数,在真正运行时才会根据函数名决定调用哪些函数。
在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错,只有运行时才会报错,这是因为OC是运行时态调用的。C调用未实现的函数就会报错。
runtime 消息机制
我们写的OC代码,它在运行的时候也是转换成runtime运行的。任何方法的本质:就是发送一个消息(用runtime发送消息,OC底层通过runtime实现)。
消息机制原理:对象根据方法编号SEL去映射表查找对应的方法实现。
每一个OC方法,底层必然有一个与之对应的runtime方法。
- 示例1
#import <objc/runtime.h>
#import <objc/message.h>
//oc实现
Persion *p1 = [[Persion alloc]init];
[p1 eat];
//底层实际方法
Persion *p2 = objc_msgSend([Persion class],@selector(alloc));
p2 = objc_msgSend(p2, @selector(init));
objc_msgSend(p2, @selector(eat));
问题
- 问题1
使用 objc_msgSend 报错 Too many arguments to function call, expected 0, have 2
解决方法:
Build Setting--> Apple LLVM 6.0 - Preprocessing--> Enable Strict Checking of objc_msgSend Calls 改为 NO