OC对象的本质(下)-程序员宅基地

技术标签: OC对象本质  ios  

1、Instance实例对象内部存贮的是什么?

(1)、isa 指针

(2)、其他成员变量

2、类对象在内存中存储的信息主要包含:

  (1)、isa指针

  (2)、superClass指针

  (3)、类的属性信息(@property)、类的对象方法信息(instance medth)也就是实例方法

  (4)、类的协议信息(@protocol)、类的成员变量信息(ivar)(比如类型和名字)

 

@interface Person:NSObject
{
    @public
    int no;
}
@end
@implementation Person
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
      //instance对象,实例对象
        Person *person=[Person new];
        Person *person1=[Person new];
        
        NSLog(@"=====类对象===");
        //class 对象、类对象
        //class 方法返回的一直都是class对象,即类对象
        Class objcClass1=[person class];
        Class objcClass2=[person1 class];
        Class objcClass3=object_getClass(person);
        Class objcClass4=object_getClass(person1);
        Class objectClass5=[Person class];
        //不管调用多少次class返回的都是类对象
        Class objectClass6=[[Person class] class];
        NSLog(@"==类对象==%p==%p==%p==%p==%p==%p",objcClass1,objcClass2,objcClass3,objcClass4,objectClass5,objectClass6);
        
        //meta-class对象,元类对象
        //将类对象当做参数传入,获得元类对象
        Class objectMetaClass=object_getClass(objcClass1);
        NSLog(@"===元类对象==%p",objectMetaClass);        

    }
    return 0;
}

运行结果:
==类对象==0x1000011b0==0x1000011b0==0x1000011b0==0x1000011b0==0x1000011b0==0x1000011b0
===元类对象==0x100001188

3、元类对象:

我们可以通过Runtime  API中的object_getClass()方法获取(将类对象当做参数传入,获得元类对象)

每个类对象在内存中有且只有一个元类对象(meta-class)。

meta-class对象和class对象的内存结构都是一样的,但是用途不一样,在内存中的存储的信息主要包括:

(1)、isa指针。

(2)、superclass。

(3)、类的类方法信息(class method)

(注意:我们可以通过class_isMetaClass()方法来判断是否是元类对象,

   object_getClass()可以传入三种类型的参数1.实例对象,2.类对象,3.元类对象。

  得到的结果也有三种:

传入的是实例对象时,获得是类对象(class 对象)

传入的是类对象时,获得是元类对象(meta-class对象)

传入的是元类对象时,获得是基类的元类对象(Root-meta-class对象)

4、在OC语言中对象可以分为三种:

   (1). 实例对象

   (2). 类对象

   (3).元类对象

   实例对象里面包含:成员变量(实例对象在底层就是结构体)

   类对象包含:isa、superclass、属性、实例方法、协议、成员变量

   元类对象包含:isa、superclass、类方法

isa指针:

instance的isa指向class类对象

当调用对象方法时,通过instance的isa找到class,最后调用对象方法的实现进行调用。

class的isa指向meta-class

当调用类方法时,通过类对象的isa找到meta-class,最后调用类方法的实现进行调用。

isa、superclass总结:

1、instance的isa指向class

2、class的isa指向meta-class

3、meta-class的isa指向基类的meta-class

4、class的superclass指向父类的class,如果没有父类,superclass指针为nil

5、meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class

6、instance调用对象方法的轨迹?

      答:isa找到class,方法不存在,就通过superclass找父类直到找到基类class,如果基类还没有找到这个方法则直接指向nil,抛出异常(没有找到方法)。

7、class调用类方法的轨迹?

      答:isa找到meta-class,方法不存在,就通过superclass找父类,父类不存在就继续找直到找到基类的meta-class元类对象,如果基类的元类对象没有找到类方法就通过superclass指向基类的类对象,如果还没有找到则指向nil。(抛出异常)

小结

对象的isa指针指向哪里?

instance对象的isa指针指向类对象。

类对象的isa指针指向元类对象。

元类对象的isa指针指向基类的元类对象。

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011534162/article/details/95976463

智能推荐

Istio入门_istio 入门-程序员宅基地

文章浏览阅读1.1k次。1. 简介在本教程中,我们将介绍服务网格的基础知识,并了解它如何实现分布式系统架构。我们将主要关注Istio,它是服务网格的一种具体实现。在此过程中,我们将介绍Istio的核心架构。2. 什么是服务网格?在过去的几十年中,我们已经看到了单体应用程序开始拆分为较小的应用程序。此外,诸如Docker之类的容器化技术和诸如Kubernetes之类的编排系统加速了这一变化。尽管在像Kubernetes这样的分布式系统上采用微服务架构有许多优势,但它也具有相当的复杂性。由于分布式服务必须相互通信,因_istio 入门

redhat6.5静态路由添加问题-程序员宅基地

文章浏览阅读1k次。 在Linux系统中,设置路由通常是为了解决和其他网段、INTERNET互通的问题。我们可以直接在命令行下执行route命令来添加路由,但不会永久保存,当网卡重启或者机器重启之后,该路由就失效了。我们可以通过一些方法来保证添加的路由设置永久有效。 首先了解一下Route命令。它是用于操作基于内核的ip路由表,它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口,如eth0...

剑指 Offer 34. 二叉树中和为某一值的路径java-程序员宅基地

文章浏览阅读108次。最初的最初一开始打算这样写的。但是呢,人家题目的要求是,必须到达叶子节点的一个路径。这个的思路是,最后到叶子下面的null时候再去做判断这个路径是否是符合要求的。里面有很多傻逼代码,轻喷。 // 这样写code会被写进去两次,因为叶子节点下面左右两个还会有指针,而path并没有变化。除非你拿map记录是否重复,才能有正确答案。 // 而且如果path这个变量写在函数里面(作为参数传递),其实是和path放在外面的效果是一样的,因为所有变量都是引用。class Solution { pub

ELK专栏之IK分词器和Java api操作索引--05_java 查询elasticsearch使用ik-程序员宅基地

文章浏览阅读707次。自己建立词库:○ 每年都会涌现一些特殊的流行的词,比如网红、蓝瘦香菇、喊麦等,一般不会出现在原生词典中。○ 步骤:①创建mydict.dic文件,补充最新的词语。②IKAnalyzer.cfg.xml文件中,配置mydict.dic。 < properties > < comment > IK Analyzer 扩展配置 _java 查询elasticsearch使用ik

Qt之Oracle数据库驱动编译_qt msvc oracle10-程序员宅基地

文章浏览阅读1k次。一、前提安装1.需要安装QT5.2.0,本介绍安装的是qt-windows-opensource-5.2.0-mingw48_opengl-x86-offline.exe;本文安装目录:c:\Qt2.安装oracle客户端,本文安装的为 :Oracle10.2客户端二、编译过程1.开始菜单中找到Qt 5.2.0 for Desktop2.打开上面的那个控制台,开始设置相关目录。进入qt中oci的工程目录cd%QTDIR%\Qt5.2.0\5.2.0\Src\qt._qt msvc oracle10

语文学科html代码,语文教育专业介绍 [代码660201]-程序员宅基地

文章浏览阅读1.3k次。语文教育专业介绍 [代码660201]2018-06-19 15:46:05文/柳岸子[导读]:本文讲述了语文教育专业的基本信息及专业介绍,如语文教育专业的课程设置、就业方向、就业前景等,还包括开设语文教育专业的院校名单。语文教育专业基本信息学历层次:专科专业名称:语文教育专业代码:660201所属门类:文化教育所属学科:教育类培养方向:书法、文秘、小教、学前、蒙古语言、小学教育、小学师资同一个专...

随便推点

用字符串哈希方法解决字符串匹配问题_minhash+部分字符串+匹配不到-程序员宅基地

文章浏览阅读243次。题目和题解如下。给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。输入格式第一行输入整数 N,表示字符串 P 的长度。第二行输入字符串 P。第三行输入整数 M,表示字符串 S 的长度。第四行输入字符串 S。输出格式共一行,输出所有出现位置的起始下标(下标从 0 开始计数),整数之间用空格隔开。数据范围1≤N≤1051≤M≤106输入样例:_minhash+部分字符串+匹配不到

再谈面向对象的三大特性-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏19次。面向对象的三大特性:封装、继承和多态。这是任何一本面向对象设计的书里都会介绍的,但鲜有讲清楚的,新手看了之后除了记住几个概念外,并没真正了解他们的意义。前几天在youtune上看了Bob大叔讲解的SOLID原则,其中有一段提到面向对象的三大特性,收获很多,但是我并不完全赞同他的观点,这里谈谈我的想法

IDEA快捷键设置复制上一行(CTRL+D)_idea向上复制一行快捷键-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏2次。IDEA快捷键设置复制上一行(CTRL+D)光标放到这里按快捷键CTRL+D就可以复制这一行的代码_idea向上复制一行快捷键

javascript原型和多维数组遍历-程序员宅基地

文章浏览阅读73次。为什么80%的码农都做不了架构师?>>> ...

网站显示 该内容被禁止访问 怎么解决_网站被禁用如何解决-程序员宅基地

文章浏览阅读3.8w次。如果您的网站首页或者内页面突然出现“该内容被禁止访问”的提示,那么说明你的网站被黑了,被黑什么了?我找找找,也没找出什么问题,到底是怎么回事,最终如何解决呢?下面,Sine安全老于为大家一一解惑。内容被禁止访问的原因:当出现这种提示时,说明您正在使用阿里云或者他们旗下万网的主机空间,阿里云是我国规模较大的云计算提供商,旗下的安全、可靠、稳定、高效的云主机,虚拟主机,域名等产品为众多客户..._网站被禁用如何解决

nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active-程序员宅基地

文章浏览阅读2w次。os: ubuntu 16.03db: postgresql 9.6.8应用连接数据库报错2019-07-29 08:40:51,445 946379015 [http-node1] ERROR BaseController [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx] - got a Exceptionorg.mybatis.spring.MyBatisSystem..._nested exception is com.alibaba.druid.pool.getconnectiontimeoutexception: wa

推荐文章

热门文章

相关标签