OC语言 - 实例对象 | 类对象 | 元类对象

OC 对象

1 - OC 中的对象主要可以分为三种

① instance 对象    (实例对象)

② class 对象         (类对象)

③ meta-class 对象(元类对象)

实例对象

1 - 实例对象是通过类 alloc 出来的对象,每次 alloc 都会产生出一个新的实例对象,占据不同的内存。如下面的 objc1、objc2 就是实例对象

NSObject *objc1 = [NSObject new];
NSObject *objc2 = [[NSObject alloc] init];

NSLog(@"objc1 = %p  objc2 = %p",objc1,objc2);
// objc1 = 0x1038292b0  objc2 = 0x103827c50

2 - 实例对象中存储的信息包括

① isa 指针(系统默认)

② 其他成员变量(你自己声明的)

类对象:类名就代表这类对象

1 - 类对象在内存是独一份,每个类在内存中有且只有一个类对象

 1 #import <Foundation/Foundation.h>
 2 #import <objc/runtime.h> // 运行时
 3 
 4 int main(int argc, const char * argv[]) {
 5     
 6     NSObject *objc1 = [NSObject new];
 7     NSObject *objc2 = [[NSObject alloc] init];
 8     
 9     Class obClass1 = [objc1 class];
10     Class obClass2 = [objc2 class];
11     Class obClass3 = [NSObject class];
12 
13     // runtime 函数
14     Class obClass4 =  object_getClass(objc1);
15     Class obClass5 = object_getClass(objc2);
16     
17     // 你会发现都是同一份
18     NSLog(@"obClass1 = %p  obClass2 = %p    obClass3 = %p",obClass1,obClass2,obClass3);
19     // obClass1 = 0x7fff91cb8118  obClass2 = 0x7fff91cb8118    obClass3 = 0x7fff91cb8118
20     NSLog(@"obClass4 = %p  obClass5 = %p",obClass4,obClass5);
21     // obClass4 = 0x7fff91cb8118  obClass5 = 0x7fff91cb8118
22     return 0;
23 }

2 - 类对象中存储的信息

① isa 指针

② superClass 指针

③ 类的属性信息、类的对象方法信息

④ 类的成员变量信息、类的协议信息

 .......

元类对象

1 - 每个类在内存中有且只有一份元类对象。它同类对象的内存结构基本一样,但是用途不一样

1     Class obClass3 = [NSObject class];            // 获取类对象
2     Class metaClass = object_getClass(obClass3);  // 获取元类对象
3     NSLog(@"metaClass = %p  obClass3 = %p",metaClass,obClass3);
4     // metaClass = 0x7fff91cb80f0  obClass3 = 0x7fff91cb8118

2 -元类对象中存储的信息

① isa 指针

② superClass 指针

③ 类的类方法信息

 .......

 

posted on 2022-05-26 16:23  低头捡石頭  阅读(74)  评论(0编辑  收藏  举报

导航