iOS-底层原理 10:底层经典题目分析

42 阅读2分钟

【面试题】iskindOfClass & isMemberOfClass 的理解

我们通过源码得知

源码分析总结

  • isKindOfClass

    • 类方法:元类(isa) --> 根元类(父类) --> 根类(父类) --> nil(父类) 与 传入类的对比
    • 实例方法:对象的类 --> 父类 --> 根类 --> nil 与 传入类的对比
  • isMemberOfClass

    • 类方法: 类的元类 与 传入类 对比
    • 实例方法:对象的父类 与 传入类 对比

验证:

打印结果如下:

【面试题】元类 中为什么会有 类对象 的 类方法?

  我们知道实例对象是类对象的实例化,类对象是元类对象的实例化

   1.class_getInstanceMethod:获取当前对象的实例方法

   2.class_getClassMethod:获取当前对象的类方法

我们进行验证

​ 可得到以下结果

无异议

我们验证​ 

前三个无异议,但是最后一个却出现了异常,我们通过观察源码发现

在通过元类获取getMeta()的时候,系统做了特殊处理,直接返回了this,因此可以查找到方法 

【面试题】类存在几份?

由于类的信息内存永远只存在一份,所以 类对象只有一份

【百度面试题】objc_object 与 对象的关系

  • 所有的对象 都是以 objc_object为模板继承过来的
  • 所有的对象 是 来自 NSObject(OC) ,但是真正到底层的 是一个objc_object(C/C++)的结构体类型

【总结】 objc_object 与 对象关系 是 继承关系

【面试题】什么是 属性 & 成员变量 & 实例变量 ?

  • 属性(property):在OC中是通过@property开头定义,且是带下划线成员变量 + setter + getter方法的变量
  • 成员变量(ivar):在OC的类中{}中定义的,且没有下划线的变量
  • 实例变量:通过当前对象类型,具备实例化的变量,是一种特殊的成员变量,例如 NSObject、UILabel、UIButton等

【附加】成员变量 和 实例变量什么区别?

  • 实例变量(即成员变量中的对象变量 就是 实例变量):以实例对象实例化来的,是一种特殊的成员变量
  • NSString 是常量类型, 因为不能添加属性,如果定义在类中的{}中,是成员变量
  • 成员变量中 除去基本数据类型、NSString,其他都是 实例变量(即可以添加属性成员变量),实例变量主要是判断是不是对象