iOS底层学习-day-2
前言-OC语法篇
我是一名iOS开发者, iOS底层 菜鸟的进阶之路30天。
问题
Objective-C中的对象,简称OC对象,主要可以分为3种?
- instance对象(实例对象)
- class对象(类对象)
- meta-class对象(元类对象)
OC的三种对象的介绍
- instance对象(实例对象)
//object1 存储的地址值就是[[NSObject alloc]init]实例的isa的地址,指向这个实例对象
NSObject *object1 = [[NSObject alloc]init];
NSObject *object2 = [[NSObject alloc]init];
- object1、object2是NSObject的instance对象(实例对象),它们是不同的两个对象,分别占据着两块不同的内存
- instance对象在内存中存储的信息包括:
- isa指针
- 其他成员变量
- instance对象在内存中存储的信息包括:
- class对象(类对象)
- 类方法信息
NSObject *object1 = [[NSObject alloc] init];
NSObject *object2 = [[NSObject alloc] init];
Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = object_getClass(object1);
Class objectClass4 = object_getClass(object2);
Class objectClass5 = [NSObject class];
NSLog(@"%p %p",object1,object2);
NSLog(@"%p %p %p %p %p",
objectClass1,
objectClass2,
objectClass3,
objectClass4,
objectClass5);// 五个都是同一个类对象
- 一个类只有一个类对象
- instance对象在内存中存储的信息包括:
- isa指针 //类的isa指针和实例不一样
- superclass指针
- 类的属性信息(@property)
- 类的对象方法信息(instance method)//比如 - (void)eat;
- 类的协议信息(protocol)
- 类的成员变量信息(ivar)//比如 int ,double
- instance对象在内存中存储的信息包括:
- meta-class对象(元类对象)
- 元类和类方法信息的对比
// meta-class对象,元类对象
// 将类对象当做参数传入,获得元类对象
Class objectClass5 = [NSObject class];
Class objectMetaClass = object_getClass(objectClass5);//元类对象
Class objectMetaClass2 = [[[NSObject class] class] class];//永远是类对象
- 每个类在内存中有且只有一个meta-class对象
- meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括:
- isa指针
- superclass指针
- 类的类方法信息(class method)
Runtime中的 objc_getClass() 和 object_getClass()区别
- objc_getClass(“Person”)
- Class objc_getClass(const char *aClassName)
- 传入字符串类名
- 返回对应的类对象
- Class objc_getClass(const char *aClassName)
- object_getClass(id obj) 更常用
- 传入的obj可能是instance对象、class对象、meta-class对象
- 返回值:
- 如果是instance对象,返回class对象
- 如果是class对象,返回meta-class对象
- 如果是meta-class对象,返回NSObject(基类)的meta-class对象