Runtime相关

对象的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

posted on 2020-03-31 17:02  JieFangZhe  阅读(116)  评论(0编辑  收藏  举报

导航