对象的isa
指针指向哪里?isa
指针有哪两种类型?
isa 等价于 is kind of
- 实例对象
isa
指向类对象 - 类对象
isa
指向元类对象 - 元类对象的
isa
指向元类的基类 -
isa
有两种类型- 纯指针,指向内存地址
NON_POINTER_ISA
,除了内存地址,还存有一些其他信息
1.一个objc对象的isa的指针指向什么?有什么作用?
指向他的类对象,从而可以找到对象上的方法.
向一个nil对象发送消息将会发生什么?
如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何错误。也不会崩溃。
向一个对象发送消息时,发生了什么?
向一个对象发送消息时,runtime会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果一直到根类还没找到,转向拦截调用,走消息转发机制,一旦找到 ,就去执行它的实现IMP 。
什么是method swizzling(俗称黑魔法)
简单说就是进行方法交换
在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。
每个类都有一个方法列表,存放着方法的名字和方法实现的映射关系,selector的本质其实就是方法名,IMP有点类似函数指针,指向具体的Method实现,通过selector就可以找到对应的IMP。
换方法的几种实现方式
- 利用 method_exchangeImplementations 交换两个方法的实现
- 利用 method_setImplementation 来直接设置某个方法的IMP
- 利用 class_replaceMethod替换方法的实现
runtime如何实现weak变量的自动置ni
runtime 对注册的类会进行布局,对于 weak 修饰的对象会放入一个 hash 表中。 用 weak 指向的对象内存地址作为key,当此对象的引用计数为0的时候会 dealloc,假如 weak 指向的对象内存地址是a,那么就会以a为键, 在这个 weak表中搜索,找到所有以a为键的 weak 对象,从而设置为 nil