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. ural 1251. Cemetery Manager

    1251. Cemetery Manager Time limit: 1.0 secondMemory limit: 64 MB There is a tradition at the USU cha ...

  2. ASP.net的url重写

    http://blog.csdn.net/windok2004/article/details/2432691 1. 有关于URL的重写,本文也只是拿来主意.相继有MS的组件“URLRewriter” ...

  3. fiddler 拦截小结

    一,拦截请求或响应常用命令 1.拦截命令 bpu 清除拦截请求 bpu http://www.baidu.com 拦截访问百度网站的请求.可以在 request 框的 WebForms 中改请求内容. ...

  4. ThinkPHP 分页类的使用及退出功能的实现

    /* ThinkPHP设置编码统一: 一.数据库设置为utf8_bin 二.HTML页面设置charset=utf-8,而且检查文档编码格式是否是utf-8.phpDesigner8设置方式为“文件- ...

  5. solrcloud线上创建collection,修改默认配置

    一.先看API,创建collection 1.上传配置文件到zookeeper 1) 本地内嵌zookeeper集群:java -classpath ./solr-webapp/webapp/WEB- ...

  6. marquee滚动语法

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  7. Java中的try,catch,finally

    讲解的是关于java中关于try.catch.finally中一些问题 下面看一个例子(例1),来讲解java里面中try.catch.finally的处理流程 public class TryCat ...

  8. Odoo Website 替换 Summernote 为第三方富文本编辑器

    随着用odoo的人越来越多,奇葩的需求也是越来越多.... 这不,有同学就想替换掉website forum里边的summernote控件,花了点时间研究了一下,先说结论:替换是可行的. 先上替换之后 ...

  9. mysql修改数据表名

    在使用mysql时,经常遇到表名不符合规范或标准,但是表里已经有大量的数据了,如何保留数据,只更改表名呢? 可以通过建一个相同的表结构的表,把原来的数据导入到新表中,但是这样视乎很麻烦. 能否简单使用 ...

  10. jQuery获取Ajax函数的返回值

    参考自: http://blog.csdn.net/crx05/article/details/7362252 function test() { var myText = ""; ...