会展有哪些城上面能不能看看具体的实例?还想考虑一下。

      前几篇文章对alloc方法和isa进行了初步探究了解了类是怎么进过创建的,这篇文章我们对类进行初步分析类中都有什么,我们创建的成员变量方法等,类是怎样进行存储嘚:

上篇文章我们描述了使用clangmain.m文件进行编译实现了看到底层实现逻辑,这篇我们直接使用objc4_752源码方式来看类结构的底层实现:

要查看类嘚结构首先我们先声明类


  

我们在main函数中添加


 
 

进入Class类进行查看:


    
 

    
 
这里我们发现了里面必定会有isa这个属性,这也就是为什么我们在objc_class 类中第一個属性为什么是isa而且还被注释掉了,因为isa是从父类继承的它一定会有这个属性,后面苹果开发人员还亲切的注释了Use `Class` instead of `struct objc_class 让我们使用Class
这就昰我们声明的类再底层的大致结构,我们看到了这么多东西但是没有看到我们在意的,我们最在意的是我们开发人员申明的成员变量,属性代理,方法都存在了哪里我们慢慢进行分析

我们继续查看结构体objc_class:中的属性进行分析,isa存储的是isa,superclass存储的是父类cache存储的是父类,還有一个就是bits了那就我们要存的东西只能是在bits里面了,刚好下面有个方法就是获取bits中的data进入查看一下

 
 
我们就看到了 methods,propertiesprotocols等属性,不出意外的话应该就是这几个东西了,找到了这几个东西那我们怎么使用代码拿出,或者怎么样在内存中看到这些确实的存储呢继续分析。

类中属性与成员变量存储位置探索

 
首先我们需要在XZPerson类中定义好属性成员变量,方法等

    
 
这里我们需要先进行分析在内存中我们应该怎样取到bits,这里我们就要对内存进行分析了,这里给大家找了个字节图片


// 向下为函数函数不占内存
 


    
 
可以看出里面只有一个属性,所以占8字節
综上所述这个时候我们查看类内存就不能值查看4段了

根据上图操作我们获取到了bits同时操作得到其中的class_rw_t;我们主要是找到属性,和方法存茬哪里现在我们已经可以查看到class_rw_t,继续查看属性properties:


它继承于list_array_tt,这里我们可以看到它是一个二维数组继续查看

 
我们可以看到,其中只有一個list显然数据是在这里进行存储的,还有一些方法有兴趣的可以进入进行自行查看,这里拿出一个方法为遍历取值方法;
我们接着上面嘚思路先取出list 查看

这个里面我们可以看到nickName 但是没有看到hobby但是这里rw中其他属性应该也不会有存hobby的地方,我们查看上面的ro

这里只是一个地址段我们进行查看ro这个地址中存储的东西到底都有什么东西,我们看下源码:

 
 
看到这个结构体我们又重燃希望baseProperties;属性可能在这里面我们繼续查看

这里又提示我们使用$4.ro 有点尴尬,其实这里我们需要做很多尝试的也很容易报错,例如:p 对象不能输出,可以尝试po 使用箭头調用属性或函数不行就使用点语法调用,都可以尝试多试试就好了,小编也经常报错!

我们发现这里还是count是1 内部只保存了nickName属性,我们嘚hobby字段还是没有找到这里还有一个ivars,我们来进行

我去,终于找到了hobby属性存储地方了我们可以看到count =2,说明这个里面还有一个值,继续查看

这樣我们就清楚了属性也会生成一个带下划线的成员变量;

我们可以得出属性与成员变量存储区别:

类中实例方法存储位置探索

根据上面屬性的分析我们可以看到ro中有baseMethodList,我们进行查看

我们可以看到sayHello这个实力方法这里的count=3,说明有3个方法继续查看

我们可以看到,剩余的2个方法为属性生成的get 和 set方法

这里我们可以看到方法中存储的method_t,我们进行查看一下这个在底层是什么结构


  

其中imp:为函数的真正实现,我们开发职工经瑺会使用的rutime交换方法实际就是交换2个方法的imp实现,

select与imp之间的关系就可以认为是一本书的目录,和章节的实际内容我们可以根据目录找到具体章节的内容,所以我们可以根据select找到imp的具体实现如果我们将两个方法的imp进行交换相当于就相当于菜谱的:第一页我们本身是红燒肉做法,直接换成了小葱拌豆腐做法你用Select找到第一页,就找到小葱拌豆腐不会找到红烧肉做法了。

发现这里的数据和baseMethodList中数据一样其实这里就是ro(read only,顾名思义,只读的这里面是开发人员不能进行修改的)中数据的备份,class_rw_t (rw read write可读可写其实我们经常在开发中添加动态添加分类,方法属性等,其实是添加到这个里面的)

但是我们的类方法呢,sayhappy方法没找到既然是类方法,就应该存在类对象中嘛我们就得先用isa找到类对象,然后进行查看

 既然是在类中我们首先先拿出类对象进行查看

根据上图我们可以看出,在ro中也存在sayHappy方法

根据以上分析,我們可以得出结论在类方法(+号方法)存储在类对象中。

根据以上我们可以的出结论在Class中存在bits属性此属性中存储类中声明的实例方法,成员變量属性代理等其中,

rw中的内容其实是运行时在DYLD过程中从ro中拷贝过来的;(这里在分析DYLD过程中再进行详细分析)

以上便是我对OC中类的初步探究如果有错误的地方还请指正,大家一起讨论开发水平一般(文章中有错误后,我发现会第一时间对博文进行修改)还望大家体谅。

学會不在意约束好自己,把该做的事做好把该走的路走好,保持善良做到真诚,宽容待别人严以律自己,其他一切随意就好未完待续。。

我要回帖

更多关于 会展有哪些 的文章

 

随机推荐