
iOS_Runtime
Jsen_Wang
态度决定一切
展开
-
iOS管理对象内存的数据结构以及操作算法--SideTables、RefcountMap、weak_table_t(二)
这篇文章是之前那篇文章iOS管理对象内存的数据结构以及操作算法--SideTables、RefcountMap、weak_table_t的补充和延伸。如果没有阅读过前一篇文章请先看那一篇。上一篇文章中关于SideTables、SideTable和RefcountMap三者关系可能描述的不太清楚。很多朋友表示看起来晕乎乎的。当初我在研究的时候也是蒙圈了好长一段时间。所以特意写了这篇文章来...转载 2020-03-21 17:38:51 · 619 阅读 · 0 评论 -
iOS管理对象内存的数据结构以及操作算法--SideTables、RefcountMap、weak_table_t (一)
通过阅读本文你可以了解iOS管理对象内存的数据结构是什么样的,以及操作逻辑。对象的reatin、release、dealloc操作是该通过怎样的算法实现的,weak指针是如何自动变nil的。 本文所阐述的内容代码部分在苹果的开源项目objc4-706中。** 本文流程:**一、引用计数的概念二、抛出问题三、数据结构分析(* SideTables、RefcountMap、weak_...转载 2020-03-21 16:00:40 · 618 阅读 · 0 评论 -
Runtime objc4-779.1 Runtime在实际开发中的应用之__attribute__
这是一个llvm的指令,很强大,官方文档中有很多说明,我们这里记录我们在开发中可能会遇到的场景和应用指令格式__attribute__(相关属性)常见场景1 availability 对版本、平台等情况做说明在某些时候我们需要对不同的版本和平台做特别处理,或者API支持,苹果也有很多这种场景,比如iOS10的系统通知API,UITableView中某些API的限定使用的API_DEPRE...原创 2020-03-12 11:48:38 · 332 阅读 · 0 评论 -
Runtime objc4-779.1 一图看懂iOS Runtime消息转发
消息发送流程图设定消息接受者为receiver图是用markdown画的,适配可能有点问题,浏览器页面放大看好一些Created with Raphaël 2.2.0开始objc_msgSend(receiver, SEL)通过receiver,获取isa指针,并获取其class在class的cache中查找SEL是否存在?匹配Method,执行IMP结束在class的method_list...原创 2020-03-11 16:21:36 · 507 阅读 · 3 评论 -
Runtime objc4-779.1 App启动过程中Runtime都干了什么?
知识准备首先我们要知道一个场景,我们点击屏幕上的应用,到我们看到应用完全展示,并可以操作,这个过程中,系统、runtime、我们自己的代码,都做了大量的工作,这个过程有很多优秀的博文已经详细的讲述过,例如深入理解iOS App的启动过程 —by 为自己丶拼个未来,这篇文章的内容其实绝大部分来自于苹果WWDC2016中的一个官方视频,如果对App启动过程不熟悉的同学可以这两个结合着看一下.Run...原创 2020-03-10 18:45:58 · 745 阅读 · 0 评论 -
Runtime objc4-779.1 为什么不能向一个已存在的类添加成员变量?有什么办法达到相同的效果(2)?
接上一篇博客继续第二种方法Func2 利用关联实现对已存在的类添加成员变量的效果涉及两个主要的API给某一个对象关联一个对象objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)获取某一个对象的关联...原创 2020-03-06 17:45:19 · 356 阅读 · 0 评论 -
Runtime objc4-779.1 为什么不能向一个已存在的类添加成员变量?有什么办法达到相同的效果?
这个问题在面试中经常被问起,答案也很明显: 因为类的结构已经在编译期被固定,不能动态更改.一句话很简单,但是背后却有很多的问题,为什么方法可以?为什么不能允许实例变量和方法一样动态化?等等问题.我们先来看看怎么解决往类中添加实例变量的需求.Func 1 动态创建类既然原来的类已经在编译期被“固定”,那么我们动态创建的类总可以添加变量吧,让新创建的类继承原来的类不就可以了?操作一下!Fu...原创 2020-03-05 17:40:37 · 534 阅读 · 0 评论 -
Runtime objc4-779.1 OC中,为什么swizzleMethod时要先addMethod?
我们swizzleMethod的方法通常如下void swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector){ Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMe...原创 2020-03-03 18:54:06 · 436 阅读 · 0 评论 -
Runtime objc4-779.1 通过runtime源码对OC对象销毁过程解析
Runtime objc4-779.1 通过runtime源码对OC对象销毁过程解析Step1 NSObject.mm line 2340// Replaced by NSZombies- (void)dealloc { // Setp2 _objc_rootDealloc(self);}Step2 NSObject.mm line 1814void_objc_rootD...原创 2020-02-27 17:22:28 · 1216 阅读 · 2 评论 -
Runtime objc4-779.1 通过runtime源码对OC对象初始化过程解析
Runtime objc4-756.2 通过runtime源码看对象初始化过程常用对象初始化代码[[NSArray alloc] init][NSArray new]我们先根据 alloc+init的方式来捋一遍runtime初始化对象的过程,看看有哪些值得我们学习的地方.以下书写方式为 <步骤号><代码所在文件><代码行数>所以阅读本文,最好是同...原创 2020-02-24 17:59:41 · 698 阅读 · 0 评论 -
Runtime objc4-756.2 objc_class中class_ro_t与class_rw_t源码关系分析
先上源码struct objc_class : objc_object { // Class ISA; Class superclass; cache_t cache; // formerly cache pointer and vtable class_data_bits_t bits; // class_rw_t * plus c...原创 2020-02-21 17:19:46 · 992 阅读 · 0 评论 -
Runtime objc4-723 Tagged Pointer & 对象初始化流程
Runtime objc4-723 Tagged Pointer & 对象初始化流程Tagged Pointer传统意义上,指针的值制式一个内存地址,它本身并没有什么意义,但是在Apple用了64位的系统后,一个指针就会有8个字节 64位,这么长的内容只表示一个地址是很浪费的。所以为了优化这个问题,Tagged Pointer概念被提出来,它的出现让一个指针的值富有了非地址之外的其他...原创 2019-02-27 17:21:38 · 239 阅读 · 0 评论 -
Runtime objc4-723 objc_class
Runtime objc4-723 objc_class前情提要:runtime的源码版本: objc4-723时间:2019-01-06objc_classstruct objc_class : objc_object {// Class ISA;Class superclass;cache_t cache; // formerly cache point...原创 2019-01-06 01:10:15 · 1178 阅读 · 0 评论 -
Runtime objc4-756.2 isa_t与isa (1)
前情提要:runtime的源码版本: objc4-723时间:2018-11-23Runtime 可能并不是你看到的那样在搜索引擎中搜索“Runtime”baidu:google:这里边第一页的内容,挨个点进去,所有的人都会拿以下代码说事情:struct objc_object { Class isa OBJC_ISA_AVAILABILITY;};struct...原创 2018-11-23 18:11:02 · 439 阅读 · 0 评论