Objective-C对象的分类
Objective-C中的对象也叫OC对象,主要分为三类:
1.实例对象(instance对象)
2.类对象(class对象)
3.元类对象(meta-class对象)
1. 实例对象(instance对象)
- instance对象:通过类alloc创建出来的对象,每次调用alloc都会创建出新的instance对象。
- 在内存中的存储信息包括:
isa指针
其他成员变量 - 结构:
struct NSObject_IMPL {
Class isa;
NSString *_name;
};
2. 类对象(class对象)
- 类在内存中有且仅有一个class对象
- 存储信息包括:
isa指针
superclass指针
属性信息
成员变量信息
对象方法
协议 -
结构
类对象的结构.png
3. 元类对象(meta-class对象)
- 每个类在内存中有且仅有一个meta-class对象
- meta-class对象和class对象的内存结构一样,但是用途不一样
- 存储信息包括:
isa指针
superclass指针
类方法 - 结构:同2
isa指针与superclass指针
isa指针与superclass指针.png由图可知:
-
isa
1> instance对象的isa指针指向class对象
2> class对象的isa指针指向meta-class对象
3> meta-class对象的isa指针指向基类的meta-class对象
4> 基类的meta-class对象的isa指针指向自己 -
superclass
1> class对象的superclass指针指向父类(如果没有父类,superclass指向nil)
2> meta-class对象的superclass指向父类的meta-class(基类的meta-class对象的superclass指向基类的class对象) -
instance对象调用对象方法的轨迹
1> 通过instance对象的isa指针找到class对象,方法不存在,通过superclass找到父类
2> 直至基类仍找不到方法,就会报unrecognized selector sent to instance XXX错误 -
class对象调用类方法的轨迹
1> class对象的isa指针找到meta-class对象,方法不存在,通过superclass找到父类
2> 直至基类的meta-class仍找不到方法,会通过基类的meta-class对象的superclass指针找到基类的class对象,如果方法仍不存在,就会报unrecognized selector sent to class XXX错误
object_getClass()、objc_getClass()、class三者的区别
-
Class object_getClass(id obj)
1> 传入的obj可能是instance对象、class对象、meta-class对象
2> 返回值
a) 如果是instance对象,返回class对象
b) 如果是class对象,返回meta-class对象
c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象 -
Class objc_getClass(const char *aClassName)
1> 传入字符串类名
2> 返回对应的类对象 -
-(Class)class、+ (Class)class
1> 返回的就是类对象
网友评论