iOS——Runtime学习(1)

iOS——Runtime学习(1)

动态语言和静态语言

了解Runtime,首先要知道动态语言和静态语言的区别:

静态类型语言,是指数据类型的检查以及函数的调用是在运行前(如编译阶段)做的。如C语言,编译阶段就要决定调用哪个函数,如果函数未实现就会编译报错。

动态类型语言,是指数据类型的检查和函数的调用是在运行时做的。运行时新的函数可以被引进,已有的函数可以被删除。

OC就是一门动态语言,主要就体现在编译后程序运行时,我们还可以对一个类做添加属性、添加方法,可以将一个普通的类改的五花八门,而这一切,都通过runtime来实现。

Runtime介绍

Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。

oc的对象方法调用就是[obj func],是我们非常熟悉的。而每次对象调用方法其实是这么一个过程:

  1. [obj func]被编译器转成消息发送:不带参数的方法被编译为:objc_msgSend(receiver,selector);带参数的方法被编译为:objc_msgSend(recevier,selector,org1,org2,…)
  2. 通过obj的isa指针找到它的 class ;
  3. 在 class 的 method list 找 func ;
  4. 如果 class 中没到 func,继续往它的 superclass 中找 ;
  5. 一旦找到 func 这个函数,就去执行它的实现IMP 。

说明:对象调用方法[obj func]时,编译阶段确定了要向哪个接收者发送message消息,但是接收者如何响应决定于运行时的判断。

类对象的理解

我对于类对象的理解就是:类也是一个对象。

通过runtime的API文件可以看到,struct objc_class和struct objc_object两个结构体中都有isa指针,很容易可以理解到objc_object的指针是指向对象的定义。而objc_class中也有一个isa指针,那就可以理解类为什么也是一个对象了,objc_class的isa指针指向的也是一个类,这个类称为元类,所以类又可以称为类对象。

每个类只有一个类对象,同时也只有一个元类,元类的isa指针指向自己

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值