Objective-C objc_class 介绍

NSObject

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

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

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

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

objc_class

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

  1. typedef struct objc_class *Class;
  2. typedef struct objc_object {
  3. Class isa;
  4. } *id;

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

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

  1. struct objc_class {
  2. Class isa;
  3. Class super_class;
  4. const charchar *name;
  5. long version;
  6. long info;
  7. long instance_size;
  8. struct objc_ivar_list *ivars;
  9. struct objc_method_list **methodLists;
  10. struct objc_cache *cache;
  11. struct objc_protocol_list *protocols;
  12. } 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

我们先看下下面的代码

  1. id objc_getClass(const charchar *aClassName)
  2. {
  3. if (!aClassName) return Nil;
  4. // NO unconnected, YES class handler
  5. return look_up_class(aClassName, NO, YES);
  6. }
  7. PRIVATE_EXTERN id look_up_class(const charchar *aClassName, BOOL includeUnconnected, BOOL includeClassHandler)
  8. {
  9. BOOL includeClassLoader = YES; // class loader cannot be skipped
  10. id result = nil;
  11. struct old_class query;
  12. query.name = aClassName;
  13. retry:
  14. if (!result  &&  class_hash) {
  15. // Check ordinary classes
  16. mutex_lock (&classLock);
  17. result = (id)NXHashGet(class_hash, &query);
  18. mutex_unlock (&classLock);
  19. }
  20. if (!result  &&  includeUnconnected  &&  unconnected_class_hash) {
  21. // Check not-yet-connected classes
  22. mutex_lock(&classLock);
  23. result = (id)NXHashGet(unconnected_class_hash, &query);
  24. mutex_unlock(&classLock);
  25. }
  26. if (!result  &&  includeClassLoader  &&  _objc_classLoader) {
  27. // Try class loader callback
  28. if ((*_objc_classLoader)(aClassName)) {
  29. // Re-try lookup without class loader
  30. includeClassLoader = NO;
  31. goto retry;
  32. }
  33. }
  34. if (!result  &&  includeClassHandler  &&  objc_classHandler) {
  35. // Try class handler callback
  36. if ((*objc_classHandler)(aClassName)) {
  37. // Re-try lookup without class handler or class loader
  38. includeClassLoader = NO;
  39. includeClassHandler = NO;
  40. goto retry;
  41. }
  42. }
  43. return result;
  44. }
  45. struct old_class {
  46. struct old_class *isa;
  47. struct old_class *super_class;
  48. const charchar *name;
  49. long version;
  50. long info;
  51. long instance_size;
  52. struct old_ivar_list *ivars;
  53. struct old_method_list **methodLists;
  54. Cache cache;
  55. struct old_protocol_list *protocols;
  56. // CLS_EXT only
  57. const uint8_t *ivar_layout;
  58. struct old_class_ext *ext;
  59. };

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

version

类的版本信息,默认为0

info

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

instance_size

该类的实例变量大小

ivars
  1. struct objc_ivar_list {
  2. int ivar_count;
  3. /* variable length structure */
  4. struct objc_ivar ivar_list[1];
  5. }

成员变量的数组

methodLists

方法定义的数组

  1. struct objc_method_list {
  2. struct objc_method_list *obsolete;
  3. int method_count;
  4. /* variable length structure */
  5. struct objc_method method_list[1];
  6. }
objc_cache

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

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

协议的数组

  1. struct objc_protocol_list {
  2. struct objc_protocol_list *next;
  3. long count;
  4. Protocol *list[1];
  5. };
 
原文地址 http://blog.csdn.net/uxyheaven/article/details/38113901

Objective-C objc_class 介绍的更多相关文章

  1. Objective-C NSObject 的实现分析(2014-10-23更新)

    NSObject 的实现分析 转载请注名出处 http://blog.csdn.net/uxyheaven iOS 的 NSObject 类没有开源, 可是呢 runtime开源了,里面有个类 Obj ...

  2. DeepLearning.ai学习笔记(四)卷积神经网络 -- week4 特殊应用:人力脸识别和神经风格转换

    一.什么是人脸识别 老实说这一节中的人脸识别技术的演示的确很牛bi,但是演技好尴尬,233333 啥是人脸识别就不用介绍了,下面笔记会介绍如何实现人脸识别. 二.One-shot(一次)学习 假设我们 ...

  3. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  4. Objective C Runtime 开发介绍

    简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...

  5. ORACLE优化器RBO与CBO介绍总结

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  6. Objective-O Runtime 运行时初体验

    Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...

  7. Objective C ARC 使用及原理

    手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...

  8. Repository 设计模式介绍

    在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据. 1.什么是Repository? "A Repository mediates b ...

  9. iOS Block详细介绍(block实现)

    Block的实现 数据结构定义 block的数据结构定义如下图 对应的结构体定义如下: struct Block_descriptor { unsigned long int reserved; un ...

随机推荐

  1. HDU4888 Redraw Beautiful Drawings(最大流唯一性判定:残量网络删边判环)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4888 Description Alice and Bob are playing toget ...

  2. C#Excel的导入与导出

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  3. HDU2191(多重背包)

    #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> ...

  4. unity 解析tmx 2

    using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; usin ...

  5. gulp-nodemon 和 gulp-livereload 配置

    一.gulp 安装 1. 全局安装: npm install -g gulp 2. 安装在项目开发环境: npm install gulp --save-dev 二.gulp-nodemon 和 gu ...

  6. 20145308刘昊阳 《Java程序设计》实验一 Java开发环境的熟悉 实验报告

    20145308刘昊阳 <Java程序设计>实验一报告 实验名称 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试J ...

  7. 求n个排序链表的交集

    题目大致意思是 给出n个排序list,每个list只有两个方法 (1)bool goNext(); 判断是否有下一个元素,没有元素返回false, 有元素返回true (2)int next(); 返 ...

  8. 洛谷 P1372 又是毕业季I Label:None

    题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...

  9. 转:jQuery插件开发精品教程,让你的jQuery提升一个台阶

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  10. thinkphp遗留问题

    $data = array( 'username' => I('username','','htmlspecialchars'), 'content' => I('content'), ' ...