isa基础知识

一、在c++中静态变量和静态函数可以通过类来访问(实例对象也可以访问),而一般的变量都是通过实例对象来访问。

在oc中也有类对象和实例对象下面就来看看什么是ios中的类对象

1、类对象(class object)  它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),

这个类对象包含了Objective-C对象的一些信息包括Objective-C对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。

2、Object-C对类对象与实例对象中的 isa 所指向的类结构作了不同的命名:类对象中的 isa 指向类结构被称作 metaclass,metaclass 存储类的static类成员变量与static类成员方法(+开头的方法);实例对象中的 isa 指向类结构称作 class(普通的),class 结构存储类的普通成员变量与普通成员方法(-开头的方法).

这也就是说通过类对象访问静态变量和函数 实例对象访问普通的变量和函数

二、类与对象

那我们看看isa指针类型的数据结构是什么样的?如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:

  1. @interface NSObject <NSObject> {
  2. Class    isa;
  3. }

不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:

  1. struct NSObject{
  2.   Class isa;
  3. }

Class是用typedef 定义的

Objective-C类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针。它的定义如下:


1

typedef struct objc_class *Class;

那NSObject可以这么写了

  1. struct NSObject{
  2.   objc_class *isa
  3. }

查看objc/runtime.h中objc_class结构体的定义如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

struct objc_class {

    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__

    Class super_class                       OBJC2_UNAVAILABLE;  // 父类

    const char *name                        OBJC2_UNAVAILABLE;  // 类名

    long version                            OBJC2_UNAVAILABLE;  // 类的版本信息,默认为0

    long info                               OBJC2_UNAVAILABLE;  // 类信息,供运行期使用的一些位标识

    long instance_size                      OBJC2_UNAVAILABLE;  // 该类的实例变量大小

    struct objc_ivar_list *ivars            OBJC2_UNAVAILABLE;  // 该类的成员变量链表

    struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  // 方法定义的链表

    struct objc_cache *cache                OBJC2_UNAVAILABLE;  // 方法缓存

    struct objc_protocol_list *protocols    OBJC2_UNAVAILABLE;  // 协议链表

#endif

} OBJC2_UNAVAILABLE;

在这个定义中,下面几个字段是我们感兴趣的:

isa:需要注意的是在Objective-C中,所有的类自身也是一个对象,这个对象的Class里面也有一个isa指针,它指向metaClass(元类),我们会在后面介绍它。

super_class:指向该类的父类,如果该类已经是最顶层的根类(如NSObject或NSProxy),则super_class为NULL。

cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。在实际使用中,这个对象只有一部分方法是常用的,很多方法其实很少用或者根本用不上。这种情况下,如果每次消息来时,我们都是methodLists中遍历一遍,性能势必很差。这时,cache就派上用场了。在我们每次调用过一个方法后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果cache没有,才去methodLists中查找方法。这样,对于那些经常用到的方法的调用,但提高了调用的效率。

version:我们可以使用这个字段来提供类的版本信息。这对于对象的序列化非常有用,它可是让我们识别出不同类定义版本中实例变量布局的改变。

时间: 2024-11-03 21:17:12

isa基础知识的相关文章

OC语言基础知识

OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类. 术语:OO面向对象.OOP面向对象编程 二.类 (一)关于类 类的设计只关注三个东西:类名.属性和方法 注意:一般名词都是类,拥有相同属性和行为的对象都可以抽象为一个类,类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词则使用驼峰标识.在对方法进行类的

李洪强iOS开发之OC语言基础知识

OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类. 术语:OO面向对象.OOP面向对象编程   二.类 (一)关于类 类的设计只关注三个东西:类名.属性和方法 注意:一般名词都是类,拥有相同属性和行为的对象都可以抽象为一个类,类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词则使用驼峰标识.在对方法进行

VII Python(4)基础知识

VIIPython(4)基础知识 python函数: 函数是为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构: 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件: 函数用于将相关功能打包并参数化: python提供很多内置函数,在python中可创建四种函数:全局函数(直接定义在模块中):局部函数(嵌套于其它函数中):lambda匿名函数(表达式,灵活性强):方法(定义在类中的函数,与特定的数据类型关联的函数,并且只能与数据类型关联一起使用): 语法: def funct

计算机硬件——基础知识

计算机硬件--基础知识 1.编程语言的作用 语言是用来沟通的,如英语.法语.葡萄牙语等.程序员编程的本质就是让计算机去工作,而编程语言就是程序员与计算机沟通的介质. 2.操作系统和硬件的关系 操作系统负责管理计算机系统中各种独立的硬件,使得它们可以协调工作. 3.应用程序.操作系统与硬件之间的关系 硬件是基础,硬件需要通过操作系统系统控制来启动硬件,并让各个硬件之间相互协同工作,在系统软件的基础上是用户,用户操控的是系统软件,并在系统软件的基础上安装相应的应用程序,来完成用户所需要的工作.所以说

UML基础知识

(这个是很久以前写的一篇关于UML的文章,现在放出来和大家共享) 了解一下类与类之间的关联基础知识很有必要,因为这些关系就像我们建造房子的基石,是面向对向编程的基础. 类中的关系有六种,分别是关联(Association)关系.聚合(Aggregation)关系.组合(Composition)关系.泛化(Generalization)关系.实现(Realization)关系以及依赖(Dependency)关系,下面分别介绍这六种关系. 依赖(Dependency)关系 依赖是对象之间最弱的一种关

IOS-OC的基础知识

IOS学习之路--OC的基础知识 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouch Media Core Services Core OS -------------------- System Framework OC的类声明,定义域 OC关键字定义为  @class O-C特有的语句for(..in ..)迭代循环,其他的条件和循环语句和c

《大话设计模式》笔记-基础知识2:面向对象基础知识

本书作者介绍每一种设计模式就是用类图(用的UML类图,其基础知识另文介绍)+面向对象语言小程序+人物对话解释知识点.本文就是介绍<大话设计模式>中所用到面向对象的基础知识(基于C#语言),方便阅读本书代码. 类与实例 (1)对象 一切事物皆为对象,对象就是看到.感觉到.听到.摸到等实实在在的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,就是针对对象来进行编程的. (2)类 类就是具有相同的属性和功能的对象的抽象的集合.例子如下 "class&q

运维小白的成长日记第四天-基础网络构建OSI七层模型-物理层基础知识

运维小白的成长日记第四天- 基础网络构建OSI七层模型-物理层基础知识 网络运维的小白和想要加入网络运维的小伙伴们值得一看哦~ 今天是初识网络运维的第四天.希望能有志同道合的小伙伴一起讨论和学习,也希望有网络运维的大神能够帮忙在网络运维这条路上帮忙指点,能够多提意见使我进步. 今天和大家分享一下OSI七层模型中的物理层基础知识. 一.物理介质 1.传输数据的物理介质有:双绞线.光纤.同轴电缆(有线电视).无线.电力线.红外.蓝牙.微波 2.信号 (1)模拟信号:比如声波(水波纹) (2)数字信号

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use