2-Runtime objc_object objc_class
一 NSObject
NSObject是OC 中的基类,除了NSProxy其他都继承自NSObject
@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"Class isa OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}
二 对象结构体 objc_object
在运行时,类的对象被定义为objc_object 类型,就是对象结构体
在OC 中每一个对象都是一个结构体,结构体都包含了一个isa 成员变量。
根据isa的定义可以知道,类型为isa_t 类型的
struct objc_object {
private:isa_t isa;
}
isa_t 的定义是什么?
是一个union的结构对象,类似于C++结构体,其内部可以定义为成员变量和函数,是一个联合类型。
三 类结构体 objc_class
类也是一个对象,类的结构体objc_class 是继承自objc_object的,具备对象的所有特征。
从源码可以看出
bits结构体的data 函数,获取到class_rw_t 指针
1 supercalss 当前类的父类
struct objc_class : objc_object {// Class ISA;Class superclass;cache_t cache; // formerly cache pointer and vtableclass_data_bits_t bits; // class_rw_t * plus custom rr/alloc flagsclass_rw_t *data() { return bits.data();}void setData(class_rw_t *newData) {bits.setData(newData);}}// class_rw_t 定义
class_rw_t* data() {return (class_rw_t *)(bits & FAST_DATA_MASK);
}
2 cache 是处理已经调用过方法的缓存
在运行时方法调用的流程,当我们调用一个方法的时候,先不去类的方法列表去寻找,而是先去cache 中去寻找。
如果方法已经存在,直接return掉。
struct cache_t {// 数组 存放方法的SEL 和 IMPstruct bucket_t *_buckets;// 用作掩码mask_t _mask;// 当前已缓存的方法数。即数组中已使用了多少位置。mask_t _occupied;
}typedef uintptr_t cache_key_t;struct bucket_t {
private:cache_key_t _key;IMP _imp;public:inline cache_key_t key() const { return _key; }inline IMP imp() const { return (IMP)_imp; }inline void setKey(cache_key_t newKey) { _key = newKey; }inline void setImp(IMP newImp) { _imp = newImp; }void set(cache_key_t newKey, IMP newImp);
};
3 class_data_bits_t
只有一个成员bits ,对类的操作几乎就是围绕它展开。
作用:64的bits,来存储与类有关的信息。
怎么存储呢?
其中包含了各种异或来说明class 的属性。把这些信息复合在一起,仅用一个UINT指针bits
来表示。当需要取出这些信息时,用需要的对应以FAST_
前缀开头和结尾的标志对掩码bits
做按位与操作。
位 在内存中的三种排列方式
64 位
0 | 1 | 2 | 3-46 |
---|---|---|---|
FAST_IS_SWIFT | FAST_HAS_DEFAULT_RR | FAST_REQUIRES_RAW_ISA | FAST_DATA_MASK |
struct class_data_bits_t {// Values are the FAST_ flags above.uintptr_t bits;public:class_rw_t* data() {// FAST_DATA_MASK 代表着一块存储结构 return (class_rw_t *)(bits & FAST_DATA_MASK);}void setData(class_rw_t *newData){assert(!data() || (newData->flags & (RW_REALIZING | RW_FUTURE)));// Set during realization or construction only. No locking needed.// Use a store-release fence because there may be concurrent// readers of data and data's contents.uintptr_t newBits = (bits & ~FAST_DATA_MASK) | (uintptr_t)newData;atomic_thread_fence(memory_order_release);bits = newBits;}}
四 class_rw_t
四 class_ro_t 和 class_rw_t
在编译之后,class_data_bits_t 的指针指向的是一个class_ro_t的地址,这个结构体是不可变的只读。
在运行时,才会通过realizeClass 函数将bits指向class_rw_t。
在程序开始运行只有初始化Class,在这个过程中,回吧编译器存在class_data_bits_t中的class_ro_t 取出来,然后创建class_rw_t,并且把ro 赋值给rw,最后把rw 设置给bits,替代之前bits 中存储的ro。
struct class_ro_t {uint32_t flags;uint32_t instanceStart;uint32_t instanceSize;uint32_t reserved;const uint8_t * ivarLayout;const char * name;method_list_t * baseMethodList;protocol_list_t * baseProtocols;const ivar_list_t * ivars;const uint8_t * weakIvarLayout;property_list_t *baseProperties;
}struct class_rw_t {uint32_t flags;uint32_t version; // 类不可修改的原始核心const class_ro_t *ro;// 下面三个array,method,property, protocol,可以被runtime 扩展,如Categorymethod_array_t methods;property_array_t properties;protocol_array_t protocols;// 和继承相关的东西Class firstSubclass;Class nextSiblingClass;char *demangledName;
};
相关文章:

Spring3.0 AOP 具体解释
一、什么是 AOP。 AOP(Aspect Orient Programming),也就是面向切面编程。能够这样理解,面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程…

通过Appium获取Android app中webview
因为要测试Android app中嵌入的web页面,所以需要从native切换到webview。网上查了好多帖子,都用到类似下面代码: //判断是否有 WEBVIEWSet<String> contextNames driver.getContextHandles();for (String contextName : contextNames)…

javascript原理_JavaScript程序包管理器工作原理简介
javascript原理by Shubheksha通过Shubheksha JavaScript程序包管理器工作原理简介 (An introduction to how JavaScript package managers work) A few days ago, ashley williams, one of the leaders of the Node.js community, tweeted this:几天前,Node.js社区…

iOS base64 MD5
网络APP 只要涉及用户隐私的数据,均不能以明文传输。 一 base64 编码 将任意的二进制数据转为编码为 65个字符的组成。 0-9 a-z A-Z / 一共 65 个 字符 例如: 1 mac 自带 base64命令 可以将base64 编码的文件可以转换 –》将桌面上1.png 图片经过…

【面试虐菜】—— Oracle知识整理《收获,不止Oracle》
普通堆表不足之处: 表更新有日志开销表删除有瑕疵表记录太大检索较慢索引回表读开销很大有序插入难有序读出DELETE产生的undo最多,redo也最多,因为undo也需要redo保护全局临时表:1 高效删除记录基于事务的全局临时表commit或者ses…

每日成长17年1月
2017年1月 1月9号 一、学习了ice ice是一个跨平台调用程序,与语言无关的一个中间件,比如,可以通过java的代码调用 c应用程序的接口。 1月11号 一.学习了 struts2 spring mybatis 的配置。 1.首先是web.xml的配置,主要配置两…

网络安全从事工作分类_那么,您想从事安全工作吗?
网络安全从事工作分类by Parisa Tabriz由Parisa Tabriz 那么,您想从事安全工作吗? (So, you want to work in security?) Every once in a while, I’ll get an email from an eager stranger asking for advice on how to have a career in security …

iOS 使用钥匙串将用户密码存入本地
在 iOS 开发中,用户一般注册时候,APP会将用户的用户名和密码直接保存到本地,便于用户下次直接进行登录。 这样就会牵扯到一个问题,用户的密码不能以明文的形式存储在本地,使用钥匙串进行保存用户的密码较为安全。 钥…

Leetcode: Sort List
Sort a linked list in O(n log n) time using constant space complexity. 记得Insert Sort List, 那个复杂度是O(N^2)的,这里要求O(nlogn),所以想到merge sort, 需要用到Merge Two Sorted List的方法(我写的merge函数…

[UT]Unit Test理解
Coding中有一个原则:Test Driven Development. UT中的一些基本概念: 1. 测试驱动 2. 测试桩 3. 测试覆盖 4. 覆盖率 单体测试内容: 1. 模块接口:测试模块的数据流 2. 局部数据结构:如变量名、初始化、类型转换等 3. 路…

gitter 卸载_最佳Gitter频道:VR和AR
gitter 卸载by Gitter通过吉特 最佳Gitter频道:VR和AR (Best Gitter channels on: VR & AR) Virtual reality is one of the biggest tech trends and a hot topic of 2016. Investment in that sector reached over 1 billion dollars early this year, while…

工作笔记---巡检记录
以下是工作中一些思路实现的笔记,业务需求是: 1、简易日历 2、质押物提交后的一天开始到当前系统时间之间才可以提交质押物 3、没有提交质押物的日期里面的图片以灰色图片站位,已经提交质押物的日期里面的图片以红色图片站位 4、图片点击之后…

大四狗找工作,持续更新
持续更新中....转载于:https://www.cnblogs.com/Wiki-ki/p/3979176.html

iOS8.0 之后指纹解锁
iOS 8.0 SDK 开放了调用指纹识别的API,但是仅限于支持5s 以后的机型 使用的话,很简单,要导入系统的库 #import <LocalAuthentication/LocalAuthentication.h> #import "ViewController.h" #import <LocalAuthenticatio…

gitter 卸载_最佳Gitter频道:Scala
gitter 卸载by Gitter通过吉特 最佳Gitter频道:Scala (Best Gitter channels on: Scala) Scala is an object-oriented functional language that has gained wide acceptance in developer communities for many of its merits. These include runtime performanc…

iOS AES加密
AES 美国国家安全局采用的加密方法,MAC 系统自带的钥匙串也是采用的AES 加密方法 有两种模式 CBC 模式 链式加密 ,密码块链,使用一个秘钥和一个初始化向量,对数据执行加密。 ECB 电子密码本方法加密,数据拆分成块&a…

(转)Unity中武器与人物的碰撞检测
自:http://blog.csdn.net/Monzart7an/article/details/24435843 目前来说有三种思路,其实前两种算变种了: 1、动画关键帧回调 范围检测。 这个是在Asset store上面下的一个例子中看到的,其实之前在做端游时,也差不多是…

CentOS Linux解决 Device eth0 does not seem to be present
通过OVF部署Linux主机后提示 ringing up interface eth0: Device eth0 does not seem to be present,delaying initialization. 解决办法: 首先,打开/etc/udev/rules.d/70-persistent-net.rules内容如下面例子所示: # vi /etc/udev/rules.d/…

meteor从入门到精通_我已经大规模运行Meteor一年了。 这就是我所学到的。
meteor从入门到精通by Elie Steinbock埃莉斯坦博克(Elie Steinbock) 我已经大规模运行Meteor一年了。 这就是我所学到的。 (I’ve been running Meteor at scale for a year now. Here’s what I’ve learned.) A year ago I wrote an article describing my first experience…
使用javascript开发2048
嗯,团队队友开发了一个简单的2048...哈哈,没办法,这游戏那么疯狂,必须搞搞啦,大家能够直接粘贴代码到一个html文件,直接执行就可以 依赖文件:jquery,假设乜有,大家能够自…

html 自动弹出框
1.点击div外部隐藏, //*代表tip_box所包含的子元素 $(body).click(function(e) {var target $(e.target);if(!target.is(#tip_box *) ) {//事件处理} });2.div动态展开 .tip_box{width:300px;height:0;border-radius:3px;background-color:#fff;overflow:hidden;bo…

3-runtime 之 Tagged Pointer
Tagged Pointer 是自从iPhone 5s 之后引入的特性 1 先说一下iOS的内存布局 代码区:存放编译之后的代码数据段 :字符串常量 : NSString *hello “hello”;已经初始化和未初始化的全局变量,静态变量堆:通过alloc&#…

编程术语_伟大的编程术语烘烤
编程术语by Preethi Kasireddy通过Preethi Kasireddy 伟大的编程术语烘烤 (The Great Programming Jargon Bake-off) Imperative vs. Declarative. Pure vs. Impure. Static vs. Dynamic.命令式与声明式。 纯与不纯。 静态与动态。 Terminology like this is sprinkled throu…

Swift 圆环进度条
Swift 圆环进度条 import UICircularProgressRing import UIKit import UICircularProgressRing class ViewController: UIViewController {var progress:UICircularProgressRing!;override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading …

Linux文件系统构成(第二版)
Linux文件系统构成/boot目录:内核文件、系统自举程序文件保存位置,存放了系统当前的内核【一般128M即可】如:引导文件grub的配置文件等/etc目录:系统常用的配置文件,所以备份系统时一定要备份此目录如:系统管理员经常需要修改的文…

include_once 问题
最近在做微信小程序,在include_once 微信文件后,该方法return 前面会用特殊字符,导致我return 给前端的本来是json串变成了字符 解决方法 : ob_clean(); return json_encode(array);转载于:https://www.cnblogs.com/zouzhe0/p/630…

babel6 babel7_当您已经准备好Babel时设置Flow
babel6 babel7by Jamie Kyle杰米凯尔(Jamie Kyle) 当您已经准备好Babel时设置Flow (Setting up Flow when you’ve already got Babel in place) Flow is a static type checker for JavaScript. It makes you more productive by providing feedback as you write code. Flow…

如何为Android上的产品设计一款合适的图标
如 果你已经完成了你的app,你一定会马上向其它人宣布这件事情。但是你需要注意一个很重要的问题,那就是app的图标。你的图标可能在项目启动之 前就已经设计好了,但我不喜欢这样,如果app没有完成实际上图标也没什么用了。如果你不是…

得到windows聚焦图片(windows 10)
有些Windows聚焦图片确实很漂亮,很希望保留下来,但是Windows聚焦图片总更好,网上有得到聚焦图片的方法,每次都手动去弄真麻烦,于是自己编了一个小程序,自动得到Windows聚焦图片,下面是运行这个小…

swift 加载gif 框架图片
swift 加载gif 框架图片 SwiftGifOrigin 以下代码 轻松搞定 let imgView UIImageView(frame: CGRect(x: 50, y: 100, width: 280, height: 200));imgView.loadGif(name: "gfff");self.view.addSubview(imgView);