【面试题】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,其他都是实例变量(即可以添加属性的成员变量),实例变量主要是判断是不是对象