OC对象的分类
- instance对象(实例对象)
instance
对象就是通过类alloc出来的对象,每次调用alloc
都会产生新的instance
对象.instance
对像在内存中存储的信息包括:其他成员变量 和isa
指针,因为所有对象都继承自NSObject
,所以都有isa
指针.
- class对象(类对象)
每个类在内存中有且只有一个class对象.在内存中存储的信息包括:
isa
指针superclass
指针- 类的属性信息(
@property
),类的对象方法信息(instance method
)- 类的协议信息(
peotocol
)类的成员变量信息(ivar
)这里的ivar
指的是成员变量的 类型 名字信息(这些信息只需要一份),ivar
具体值存储在instance
对象当中.
- meta-class对象(元类对象)
meta-class
的获取:通过runtime函数: object_getClass()
,传入的对象是class
对象.而非instance
对象.OC对象的class
方法就是返回的class
对象,如果要获取meta-class
需要通过 object_getClass()
方法.每个类在内存中有且只有一个meta-class
对象.meta-class
对象和 class
对象的内存结构是一样的,但用途和存储的信息不同.meta-class
中包含的信息:
isa
指针superclass
指针- 类的类方法信息(class method)
- ............
NSObject * obj1 = [[NSObject alloc] init];
//传入instcne对象获取的是class对象
Class objClass4 = object_getClass(obj1);
//传入class对象获取的是meta-class对象
Class objMetaClass = object_getClass([obj1 class]);
NSLog(@"objClass4 = %p",objClass4);
NSLog(@"objMetaClass = %p",objMetaClass);
//NSLog
objClass4 = 0x7fff91cb8140//class对象
objMetaClass = 0x7fff91cb80f0//meta-class对象
Class 对象代码
NSObject * obj1 = [[NSObject alloc] init];
NSObject * obj2 = [[NSObject alloc] init];
Class objClass1 = [obj1 class];
Class objClass2 = [obj2 class];
//注意:object_getClass 和 objc_getClass
Class objClass3 = object_getClass(obj1);
Class objClass4 = object_getClass(obj1);
Class objClass5 = [NSObject class];
//NSLog
obj1 = 0x102a08920
obj2 = 0x102a04640
objClass1 = 0x7fff91cb8140
objClass2 = 0x7fff91cb8140
objClass3 = 0x7fff91cb8140
objClass4 = 0x7fff91cb8140
objClass5 = 0x7fff91cb8140
object_getClass
和 objc_getClass
区别:
打开objc4
源码,检索objc_getClass
.查看.mm文件可以看到有objc-class-old.mm
和objc-runtime-new.mm
两个文件中有objc_getClass
的实现.我们查看最新的文件.最终发现objc_getClass
的实现在objc-runtime.mm
文件中.
1.Class objc_getClass(const char *aClassName)
1> 传入字符串类名
2> 返回对应的类对象
2.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对象
3.- (Class)class、+ (Class)class
1> 返回的就是类对象
- (Class) {
return self->isa;
}
+ (Class) {
return self;
}