Objective-C objc_class 介绍

Objective-C objc_class 介绍

NSObject

Objective-C 中 NSObject是大多数类的根类。

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}

它有一个isa属性,类型是Class.

苹果已经将 ObjC runtime 代码开源了,我们下载下,看看Class到底是什么http://opensource.apple.com/tarballs/objc4/objc4-493.9.tar.gz

objc_class

我们可以在<objc.h>文件里看到Class的定义

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

Class 是一个 objc_class 结构类型的指针, id是一个 objc_object 结构类型的指针.

objc_class的定义可以在<runtime.h>里找到

struct objc_class {
    Class isa;
    Class super_class;
    const char *name;
    long version;
    long info;
    long instance_size;
    struct objc_ivar_list *ivars;
    struct objc_method_list **methodLists;
    struct objc_cache *cache;
    struct objc_protocol_list *protocols;

} OBJC2_UNAVAILABLE;

接下来我们来看下每个属性的意思

isa

是一个 Objective-C Class 类型的指针. 实例对象有个isa的属性,指向Class, 而Class里也有个isa的属性, 指向meteClass. 这里就有个点, 在Objective-C中任何的类定义都是对象.

super_class

指向该类的父类, 如果该类已经是最顶层的根类(如 NSObject 或 NSProxy),那么 super_class 就为 NULL.

他们的关系呢,这里有个图http://www.sealiesoftware.com/blog/class%20diagram.pdf

name

我们先看下下面的代码

id objc_getClass(const char *aClassName)
{
    if (!aClassName) return Nil;

    // NO unconnected, YES class handler
    return look_up_class(aClassName, NO, YES);
}

PRIVATE_EXTERN id look_up_class(const char *aClassName, BOOL includeUnconnected, BOOL includeClassHandler)
{
    BOOL includeClassLoader = YES; // class loader cannot be skipped
    id result = nil;
    struct old_class query;

    query.name = aClassName;

 retry:

    if (!result  &&  class_hash) {
        // Check ordinary classes
        mutex_lock (&classLock);
        result = (id)NXHashGet(class_hash, &query);
        mutex_unlock (&classLock);
    }

    if (!result  &&  includeUnconnected  &&  unconnected_class_hash) {
        // Check not-yet-connected classes
        mutex_lock(&classLock);
        result = (id)NXHashGet(unconnected_class_hash, &query);
        mutex_unlock(&classLock);
    }

    if (!result  &&  includeClassLoader  &&  _objc_classLoader) {
        // Try class loader callback
        if ((*_objc_classLoader)(aClassName)) {
            // Re-try lookup without class loader
            includeClassLoader = NO;
            goto retry;
        }
    }

    if (!result  &&  includeClassHandler  &&  objc_classHandler) {
        // Try class handler callback
        if ((*objc_classHandler)(aClassName)) {
            // Re-try lookup without class handler or class loader
            includeClassLoader = NO;
            includeClassHandler = NO;
            goto retry;
        }
    }

    return result;
}

struct old_class {
    struct old_class *isa;
    struct old_class *super_class;
    const char *name;
    long version;
    long info;
    long instance_size;
    struct old_ivar_list *ivars;
    struct old_method_list **methodLists;
    Cache cache;
    struct old_protocol_list *protocols;
    // CLS_EXT only
    const uint8_t *ivar_layout;
    struct old_class_ext *ext;
};

objc_getClass从一个字串返回一个类,look_up_class,先创建一个old_class对象,name赋值为这个字串,如果找到了,就返回old_class.看下old_class的结构就能看出name这个属性存的值就是类的名字(其实name不就是名字嘛)

version

类的版本信息,默认为0

info

供运行期使用的一些位标识。

instance_size

该类的实例变量大小

ivars
struct objc_ivar_list {
    int ivar_count;
    /* variable length structure */
    struct objc_ivar ivar_list[1];
}

成员变量的数组

methodLists

方法定义的数组

struct objc_method_list {
    struct objc_method_list *obsolete;
    int method_count;
    /* variable length structure */
    struct objc_method method_list[1];
}
objc_cache

指向最近使用的方法.用于方法调用的优化.

struct objc_cache {
    unsigned int mask /* total = mask + 1 */;
    unsigned int occupied;
    Method buckets[1];
};
protocols

协议的数组

struct objc_protocol_list {
    struct objc_protocol_list *next;
    long count;
    Protocol *list[1];
};

Objective-C objc_class 介绍

时间: 2024-10-27 19:48:25

Objective-C objc_class 介绍的相关文章

NSObject 类分析(未完成)

NSObject 类分析(未完成) 转载请注名出处 http://blog.csdn.net/uxyheaven iOS 的 NSObject 类没有开源, 但是呢 runtime开源了,里面有个类 Object 看接口和NSObject差不多,下面我就对着 Object 的代码来分析下 NSObject runtime代码在http://opensource.apple.com/tarballs/objc4/objc4-493.9.tar.gz下载,Object在<Object.h>, 这里

Qt for iOS,Qt 与Objective C混合编程

项目设置 既然要聊 Qt 混合 OC 编程,首先要简单介绍一下 Objective C .我只有一句话:Go,问搜索引擎去.因为我所知实在有限,怕误导了您.当然如果您不怕,往下看吧. OC源文件介绍 首先我要说一下 Objective C 的源文件,后缀是.m 或 .mm ,在 .mm 文件里,可以直接使用 C++ 代码.所以,我们要混合 Qt 代码与 OC 代码,就需要在 Qt 项目里加入 mm 文件. pro 文件配置 Qt SDK for Mac ,安装之后, Qt Creator 会使用

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

Windows下搭建objective C开发环境

最近打算针对iPhone.iPod touch和iPad开发一些应用,所以,需要开始学习Objective C(苹果推出的类似C语言的开发语言).由于苹果的自我封闭的产业链发展模式(从芯片.机器.开发语言.终端产品.服务)的限制,要想开发针对苹果 iPhone等产品的应用程序,就需要用Mac机器,在Xcode的IDE上使用Objective C语言开发.Mac机器就不用说了,那比PC机器要贵不少(当然性价比还是很高的),所以,要想廉价方式学习Objective C就必须要在Windows上能搭建

Realm数据库的简单介绍和使用

给大家介绍一个数据库操作的框架Realm,本文主要以iOS 平台的使用场景为例. realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android: 核心数据引擎由C++打造,并不是建立在SQLite之上的ORM, 拥有独立的数据库存储引擎: 据官方称性能上比sqlite, coredata牛逼,而且使用起来更加简单, 更易入门. 下载地址:https://realm.io/cn/ 使用教程:https://realm.io/docs/objc/

oc语言学习之基础知识点介绍(四):方法的重写、多态以及self、super的介绍

一.方法重写 /* 重写:当子类继承了父类的方法时,如果觉得父类的方法不适合,那么可以对这个方法进行重新实现,那么这个就重写. 注意:也就是说,一定只能发生在父类和子类关系中. 然后是子类重新实现父类的方法,绝对不是再写一个自己类的方法. 代码中原话叫:子类重写父类方法. 因为父类定义的方法不一定适用于子类. 注意:如果有重写,那么调用的是自己重写后的方法,如果没有重写,那么就调用的是父类的方法. 所以我们方法有一个执行的过程: 1.先去自己类里面找这个方法,如果找到就执行. 2.如果没找到,就

Objective-C 源码(一):对象模型

首先,你要先弄清楚什么是类,什么是对象.(为了说清楚这个问题,先举个栗子:类->对象->实例:人类是类:某个人是对象:你是实例:实例本身也是对象.这下基本能理解其中的差别了,要是还是搞不清楚,自己去google一下吧.) 对象 在Objective-C中,每一个对象都是某个类的实例,且这个对象的isa指针指向它所属的类.打开 objc-private.h文件,在第126行可以看到 Objective-C???? 对象的定义struct objc_object ,Objective-C中对象本质

iOS Objective -C Runtime 运行时之一: 类与对象

// --------------------------------------------------- 参考:南峰子的技术博客 http://southpeak.github.io //---------------------------------------------------- OC语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们编写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等.

转载 理解objective c的Runtime

注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ObjC 特性 —— ObjC Runtime.这是因为这门语言很容易上手,几个小时就能学会怎么使用,所以程序员们往往会把时间都花在了解 Cocoa 框架以及调整自己的程序的表现上.然而 Runtime 应该是每一个 ObjC 都应该要了解的东西,至少要理解编译器会把 [target doMeth