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 charchar *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 charchar *aClassName)
- {
- if (!aClassName) return Nil;
- // NO unconnected, YES class handler
- return look_up_class(aClassName, NO, YES);
- }
- PRIVATE_EXTERN id look_up_class(const charchar *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 charchar *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 介绍的更多相关文章
- Objective-C NSObject 的实现分析(2014-10-23更新)
NSObject 的实现分析 转载请注名出处 http://blog.csdn.net/uxyheaven iOS 的 NSObject 类没有开源, 可是呢 runtime开源了,里面有个类 Obj ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week4 特殊应用:人力脸识别和神经风格转换
一.什么是人脸识别 老实说这一节中的人脸识别技术的演示的确很牛bi,但是演技好尴尬,233333 啥是人脸识别就不用介绍了,下面笔记会介绍如何实现人脸识别. 二.One-shot(一次)学习 假设我们 ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective C Runtime 开发介绍
简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...
- ORACLE优化器RBO与CBO介绍总结
RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...
- Objective-O Runtime 运行时初体验
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
- Objective C ARC 使用及原理
手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...
- Repository 设计模式介绍
在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据. 1.什么是Repository? "A Repository mediates b ...
- iOS Block详细介绍(block实现)
Block的实现 数据结构定义 block的数据结构定义如下图 对应的结构体定义如下: struct Block_descriptor { unsigned long int reserved; un ...
随机推荐
- 解决(空密码的root)提示修改phpmyadmin用户密码
打开 phpmyadmin数据表,点击权限 如果没有,请参考:http://jingyan.baidu.com/article/636f38bb293a9bd6b846100d.html 创建 在 ...
- ZOJ3229 Shoot the Bullet(有源汇流量有上下界网络的最大流)
题目大概说在n天里给m个女孩拍照,每个女孩至少要拍Gi张照片,每一天最多拍Dk张相片且都有Ck个拍照目标,每一个目标拍照的张数要在[Lki, Rki]范围内,问最多能拍几张照片. 源点-天-女孩-汇点 ...
- [转]复制虚拟机后linux中的eth0变成eth1问题
为什么原来的eth0会变成eth1? 很多Linux distribution使用udev动态管理设备文件,并根据设备的信息对其进行持久化命名.udev会在系统引导的过程中识别网卡,将mac地址和网卡 ...
- jQuery的封装和扩展方式
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Haproxy内网连接阿里云存储OSS后提供下载
global log 127.0.0.1 local0 maxconn #最大连接数 chroot /usr/local/haproxy uid #所属运行的用户UID gid #所属运行用用户组 d ...
- 【BZOJ】2253: [2010 Beijing wc]纸箱堆叠
题意 三维严格偏序最长链.(\(n \le 50000\)) 分析 按第一维排序然后以第二和第三维作为关键字依次加入一个二维平面,维护前缀矩形最大值. 题解 当然可以树套树....可是似乎没有随机化算 ...
- UVA 11461 - Square Numbers(水题)
题目链接 #include <cstdio> #include <cstring> #include <string> #include <cmath> ...
- Android -- 打开某个指定的网站
1. 要使用的代码 Intent intent = new Intent(); intent.setData(Uri.parse(sUrl)); intent.setAction(Intent.ACT ...
- Hibernate学习笔记1
xml文件[封装]写SQL语句<class class='com.briup.user',table='s_emp'> <property name='id' column='id' ...
- 深入C#判断操作系统类型的总结详解(转载)
Windows操作系统的版本号一览 操作系统 PlatformID 主版本号 副版本号 Windows95 1 4 0 Windows98 1 4 10 WindowsMe ...