Runtime(一)

概念

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 
#import 

   //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

你可能感兴趣的:(Runtime(一))