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