Objective-C葵花宝典第一重(内功篇)--类与对象

 

Objective-C葵花宝典第一重(内功篇)--类与对象

转自:http://husbandman.diandian.com/post/2012-08-17/40036035008

Objective-C葵花宝典第一重(内功篇)–类与对象

切记:欲练神功,挥刀自宫;炼丹服药,内外齐通。

今练气之道,不外存想导引,渺渺太虚,天地分清浊而生人,人之练气,不外练虚灵而涤荡昏浊,气者命之主,形者体之用。天地可逆转,人亦有男女互化之道,此中之道,切切不可轻传。修炼此功,当先养心,令心不起杂念,超然于物外方可,若心存杂念,不但无功,反而有性命之忧。

概述

对象

Objective-C中,类和对象的底层数据结构,可以参考Objective-C底层数据结构.

其中对象是通过struct objc_object结构实现

typedef struct objc_object *id;

对象在运行时候,会产生如下图的结构形式

我们把这个转换成种更容易理解的数据组织形式

真正的内存形式是这样的

从对象内存形式上来看.对象内的变量成员,是从祖类继承而来(子成父业啊),在对象内部生成副本.从对象的内存组织来看,对象本身并不关心行为(对象的方法或实例方法),重点都在数据的组织上.

(_)  _____  ____ _

/ /  / ___/  / __ `/

/ /  (__  )  / /_/ /

/_/  /____/  \__,_/

对象的都有一个isa实例变量,它是从继承层次最高的NSObject继承而来.isa是表示对象的关键.在Objective-C中,是不是第一等对象,isa就是其标志,就好像<变形金刚>中的汽车人都有一个

如果你发现的铁家伙是这个标志

那你就赶紧逃命去吧~

isa是一个指针,指向了该对象的类.实质上,同一个类的实例,都指向同一个类对象(类也是一种特殊对象).类中包含了实例方法,也就是说,同一个类的所有实例共用了这些实例方法.消息就是发送给对象,对象转交给其isa指向类去处理.这种现象类似于当下火热的云计算.

云鸡一算,要风得风,要雨得雨

Objective-C的这种设计,既可以友好地实现面向对象,又可以有效地节约内存.降低冗余数据.对象对方法的调用是通过isa间接去调用,这样就造成了方法调用的动态性,主要原因是:

一个对象并不晓得它能否应答一个方法,它本身既不包含方法的实现,也不包含有方法的指针,而是间接通过isa转到自己的类才能知道

类中的实例方法是以链表形式存在,运行时候,可以修改链表中的实例方法,即可以增删改查,这与C中的函数默认都是extern的不同

从上面的分析,isa的意义就更加重大,倘若没有isa,一个对象就跟char,int类型等没啥区别了,不具备回应消息的本领.所以说,isa是什么,就好比是古时候官员的乌纱帽,有乌纱帽,就有权力,乌纱帽没了,就是凡夫俗子

类是通过struct objc_class结构实现的,

typedef struct objc_class *Class;

在运行时,将会产生如下图这样的结构

在Objective-C的世界里,一看到isa的第一个反应就是,咦,对象.是的,Objective-C中的类其实也是一种对象.

天地不仁,以万物为刍狗<道德经>

既然天地生的万物,那么天地又是何物?

如果人类是上古神仙女娲所造,那女娲又因何而生呢?

一般程序语言,对象的尽头都是自己生了自己.自己下个蛋,爬出来了自己.似乎是悖逆的,但确实如此.作为根类的NSObject就是这样一个家伙!

这看起来确实很困惑,但是譬如生物学中的造血干细胞可谓细胞的制造厂,但是造血干细胞又是谁制造的呢,咦,也是造血干细胞

首先,类对象也是一种对象,那么它也会有自己的行为,这种行为称作类方法.与一般的类实例一样,类对象也不具备处理类方法的能力,也是要借助isa找到它所属的类,既元类,去调用类方法,类对象本身也是专注于数据的存储和布局形式.可参考类和元类

但与常规的类实例不同,一般而言类对象的字段是固定的.即它默认情况下总是包含isa,super_class,name,version,info,instance_size,ivars,methodLists,cache,protocols.

一个类的数据形式会是如下

而它的数据在内存中的组织形式也是线性的

我们知道,在Objective-C中,我们一般的定义形式是声明一个类的实例变量,属性,实例方法和类方法.并不能声明类变量.所以一般而言类对象的数据形式就是如上图的那些固定的字段.

除了我们介绍的isa,剩余的字段的含义如下:

super_class 指向父类的指针.因为Objective-C借鉴了SimTALK,在类的继承实现上,是通过一条继承链实现的.super_class就是整个继承链的核心字段.

name 类的名字

version 版本

info 信息

instance_size 实例的内存大小

ivars 是一个指向实例变量列表的指针

methodLists 是一个指向实例方法列表的指针

cache 缓存了常用的实例方法

protocols 是一个指向协议列表的指针

我们可以这样简单地去解释运行时的Objective-C的数据结构的含义

对象与实例变量有关,对象自身存储着实例变量

类对象与实例方法有关,实例方法必须通过类对象才能知晓

元类与类方法有关, 类方法必须通过元类才能知晓

对象,类与元类可谓与道教里的三清一般哦~~

运行时的类和对象

运行时的类和对象如下图

一般而言

isa关于对象是什么类

super_class关于继承链

所有元类都有同样的元类,因为他们的isa都指向同一个根元类

参考

Objective-C底层数据结构

类和元类

推荐拓展阅读

时间: 2024-07-28 13:18:20

Objective-C葵花宝典第一重(内功篇)--类与对象的相关文章

第二十七篇 类和对象相关知识

类和对象 1. 什么叫类:类是一种数据结构,就好比一个模型,该模型用来表述一类食物(食物即数据和动作的结合体),用它来生产真是的物体(实例) 2. 什么叫对象:睁开眼,你看到的一切事物都是一个个的对象,你可以把对象理解为一个具体的事物(事物即数据和动作的结合体) (铅笔是对象,人是对象,房子是对象,狗是对象,你看到的都是类) 3.类与对象的关系:对象都是由类产生的,女娲造人,首先由一个造人的模板,这个模板就是人类,然后女娲根据类的定义来生产一个个的人 4. 什么叫实例化:由类生产对象的过程叫实例

JAVA入门第二季 第一章 类和对象

面向对象编程 Object Oriented Programming OOP 第一.什么是类和对象 在具体说明类和对象之前,先说说别的. 眼睛在人类身体上最为有用的器官.如果一个没有了眼睛,这个人与世界的联系会大大减小.因为人脑主要是通过眼睛来获取数据的:当然也有其它器官获取的哦数据帮助我们更加准确的描述我们所看到的现象.眼睛通过光线作用,把客观物理世界投影到人脑.人脑是由亿万多脑细胞组成.脑细胞神经元有反馈机制,当级联的脑脑细胞神经元多起来后,通过反复的实验和检测,使得大脑得到对客观世界有更准

面向对象——类与对象篇(第一章)

一.什么是面向对象? 想要学习面向对象,就要先知道面向过程. 面向过程 面向过程:面向过程的程序的核心是过程(流水线思维),就是关心解决问题的步骤. 面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机.嵌入式开发.Linux/Unix等一般采用面向过 程开发,性能是最重要的因素. 缺点:没有面向对象易维护.易复用.易扩展 适用场景: 一旦完成很少改变的场景(著名的Linux内核.git.以及Apache HTTP Server等) 面向对象 面向对象:

objective - c 类和对象

知识点 1.初步认识 OC 2.xcode使用 3.面向对象编程思想,类和对象 4.类的定义和使用 5.类的实例化--对象 6.声明和实现相分离 =========================================== 1.需要理解的(理论部分) 第一部分:OC和面向对象 1.1.OC语言的历史,特点.重要程度 [什么是OC] objective - c   在C语言基础上开发, 面向对象的语言: 注意C语言和oc语言语法的区别: IOS, iphone, ipad … [进入OC

python的类和对象——进阶篇

写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多时候我们在想要为自己的青春拼搏一次的时候都输给了偶尔的抵触和轻松愉悦的生活.我们不过和走到最后的人差了两个字——坚持!所以尽管进入类和对象这一部分,大家都会有畏难心理,但是坚持一下下,你就会是那个走到最后的人! 回顾 上一篇中我们初步的认识了类和对象,了结了它们的一些语法,就相当于得到了一个对象的骨

python基础-第七篇-7.1初识类和对象

创建类和对象 刚开始我们接触得多的编程方式为面向过程编程,这种方式就是根据业务逻辑从上往下垒代码,后来又出现了函数式编程,就是为了提高代码的重用性,减轻程序猿的工作量--而今天我们即将学的 面向对象编程则是使用类和对象来实现的,类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数 class是关键字,表示类 创建对象--类名称后加括号 #创建类 class foo: def bar(self): print('bar') def

《Java入门第二季》第一章 类和对象

什么是类和对象 如何定义 Java 中的类 如何使用 Java 中的对象 Java中的成员变量和局部变量1.成员变量:在类中定义,描述构成对象的组件.2.局部变量:在类的方法中,用于临时保存数据.3.成员变量的有效范围:类中的所有方法都可以调用成员变量.4.局部变量和成员变量允许重名,这个时候局部变量具有更高优先级. Java 中的构造方法1.若不自己写构造方法,Java会默认给一个无参的构造方法.但若是自定义了构造方法,不论有无参数,系统默认给的无参构造器都会失效.2.写构造器的时候可以顺便检

Python第一周基础篇

<感言:首先感谢alex老师精彩课程,第一周的第一天,随着金角大王的豪言壮语般的心灵鸡汤完美收场.此刻坐在电脑前的我仍是热血澎湃,下定决心好好跟着大王一起学好python> ----祝老师教师节快乐                                      Python第一周基础篇 博文结构: --1--python2.*与python3.*主要区别 --2--python安装与配置 --3--PyCharm开发工具的安装与配置 --4--变量的定义 --5--注释的使用 --

学习java随笔第七篇:java的类与对象

类 同一个包(同一个目录),类的创建与调用 class Man{ String name; void GetMyName() { System.out.println(name); } } public class Person { public static void main(String arges[]) { Man m=new Man(); m.name="小黄"; m.GetMyName(); } } 运行结果 不同的包(不同目录目录),类的创建与调用 package Peo