分类
- instance 对象(实例对象)
- class 对象(类对象)
- meta-class 对象 (元类对象)
instance 对象
通过类 alloc
出来的对象,叫实例对象,每次调用 alloc
都会产生新的实例对象,分别占据着不同的内存。
instance
对象在内存中只存储着对象的成员变量和 isa
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSObject *obj = [[NSObject alloc] init];
NSObject *obj1 = [[NSObject alloc] init];
NSLog(@"obj - %p" ,obj);
NSLog(@"obj1 - %p",obj1);
}
return 0;
}
2021-02-04 22:11:07.244727+0800 object[921:18627] obj - 0x100649ec0
2021-02-04 22:11:07.245284+0800 object[921:18627] obj1 - 0x10064b980
class 对象
获取类对象的方法:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSObject *obj = [[NSObject alloc] init];
NSObject *obj1 = [[NSObject alloc] init];
NSLog(@"obj - %p" ,obj);
NSLog(@"obj1 - %p",obj1);
Class c = [obj class];
Class c1 = [obj1 class];
Class c2 = [NSObject class];
Class c3 = object_getClass(obj);
Class c4 = object_getClass(obj1);
NSLog(@"c - %p" , c);
NSLog(@"c1 - %p", c1);
NSLog(@"c2 - %p", c2);
NSLog(@"c3 - %p", c3);
NSLog(@"c4 - %p", c4);
}
return 0;
}
2021-02-04 22:19:14.469627+0800 object[1055:25117] c - 0x7fff88a9be08
2021-02-04 22:19:14.469667+0800 object[1055:25117] c1 - 0x7fff88a9be08
2021-02-04 22:19:14.469701+0800 object[1055:25117] c2 - 0x7fff88a9be08
2021-02-04 22:19:14.469731+0800 object[1055:25117] c3 - 0x7fff88a9be08
2021-02-04 22:19:14.469762+0800 object[1055:25117] c4 - 0x7fff88a9be08
可以看出获取到的地址是同一个地址,所以类对象是只有一个的,一个类有且只有一个类对象。
类对象在内存中存储的信息有:
- isa 指针
- superclass 信息
- 类的属性信息
- 类的对象方法信息
- 类的协议信息
- 类的成员变量信息(只存了描述信息),实际的值在每个对象中存储。
meta-class 对象
描述类信息的对象叫元类对象
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 传入类对象
Class metaclass = object_getClass([NSObject class]);
NSLog(@"meta class - %p", metaclass);
}
return 0;
}
2021-02-04 22:29:14.858705+0800 object[1149:29923] meta class - 0x7fff88a9bde0
class 方法一直返回的都是类对象,所以使用类对象调用 class 获取的依旧是类对象,而不是元类对象。
每个类只有一个元类对象
元类对象在内存中存储的信息有:
- isa
- superclass
- 类的类方法信息
判断一个对象是否是元类对象
BOOL isMeta = class_isMetaClass(metaclass);