【OC底层】OC对象本质,如 isa, super-class

 

Objective-C的本质

1、我们编写的Objective-C,底层现实都是C/C++,代码生成步骤如下:
 

2、在OC中的所有面向对象的实现,都是基于C/C++的数据结构实现的

3、将Objective-C代码转换为C\C++代码

  xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件

    注:如果需要链接其他框架,使用-framework参数。比如-framework UIKit

 

一个OC对象在内存中是如何布局的? 

 

NSObject基类的实现:

 

子类的实现:

 

子类的拆解:

 1、在OC中的对象,就是 C++中的 struct来实现的

 2、每个OC对象中都会有一个 isa 的指针,isa指向的是 objc_class 结构体,如下:

通过代码可以看得出在OC2 中已经不能通过  objc_method_list 之类的方式获取方法名、实例、协议之类的了,需要使用新的方法获取

思路:自定义一个和oc源码中 objc_class 结构一样的结构体,然后将对象的isa 强转成我们自定义的那个,再去调用

如下是OC中objc_class的源码:

新的OC版本中方法、属性、协议相关数据都存在了 bits 

通过 bits.data() 返回 class_rw_t 结构,如下:

bits.data() 的实现:

其中需要 通过 & FAST_DATA_MASK 才能获取到真实的地址

 

 OC对象的分类

Objective-C对象主要分为以下3类:

  1> instance对象(实例对象)

  2> class对象(对象)

  3> meta-class对象(元类对象)

 

通过下面的代码可以分别获取3种对象:

复制代码
        NSObject* obj = [[NSObject alloc]init];         const char* className = [@"NSObject" cStringUsingEncoding:NSUTF8StringEncoding];                  // 实例对象        NSLog(@"instance: %p",obj);                  // 类对象        NSLog(@"NSObject class: %p", [NSObject class]);         // 同上        NSLog(@"obj class: %p
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信