KVO的实现原理

首先需要了解KVO基本使用,KVO的全称 Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变。

阅读全文 »

关联对象

使用runtime为Category动态关联对象

使用 runtime 给系统的类添加属性,首先需要了解对象与属性的关系。我们通过之前的学习知道,对象一开始初始化的时候其属性为nil,给属性赋值其实就是让属性指向一块存储内容的内存,使这个对象的属性跟这块内存产生一种关联。那么如果想动态的添加属性,其实就是动态的产生某种关联就好了。而想要给系统的类添加属性,只能通过分类。
这里给NSObject添加name属性,创建NSObject的分类,我们可以使用@property给分类添加属性。

阅读全文 »

Category的原理

回顾OC对象的本质,每个OC对象都含有一个isa指针,arm64 之前,isa仅仅是一个指针,保存着对象或类对象内存地址,在 arm64 架构之后,apple对isa进行了优化,变成了一个共用体 union 结构,同时使用位域来存储更多的信息。OC对象的isa指针斌不是直接指向类对象或者是元类对象的,而是需要 &ISA_MASK 通过位运算才能取到相应的地址,但是为什么要这样做。

阅读全文 »

我们接着上篇 Class-Model 继续围绕着 Runtime 来更深入的了解一个继承与 NSObject 类的初始化的过程。

load

我们先来了解下 load 方法,当一个类或者分类添加到运行时时候会被调用,通常的用法是在类中实现这个方法然后我们去做 Method Swizzling 操作,实质上就是可以在运行时干预类的加载。通过简单的Demo我们可以发现,一个类和她的子类都会执行 load 方法,而且子类会后置执行 load 方法。同时,分类中的 load 方法会先于主类中的。

prepare_load_methods

我们可以找到 objc-runtime-new.mm 中的 prepare_load_methods 方法

阅读全文 »

之前的博客留了一个64位CPU中isa指针的坑,今天来填个坑。

isa 的本质

回顾OC对象的本质,每个OC对象都含有一个isa指针,arm64 之前,isa仅仅是一个指针,保存着对象或类对象内存地址,在 arm64 架构之后,apple对isa进行了优化,变成了一个共用体 union 结构,同时使用位域来存储更多的信息。OC对象的isa指针斌不是直接指向类对象或者是元类对象的,而是需要 &ISA_MASK 通过位运算才能取到相应的地址,但是为什么要这样做。

阅读全文 »

最近感觉应该重新看下开源的 Runtime,希望能有更深层的理解,下面几篇都会围绕着runtime来写

对象

1.png

OC 中,每一个对象都是一个类的实例,且这个对象的 isa 指针指向它所属的类。

PS:这里留下个,因为isa在现有的64位CPU下已经不是一个单纯的指针了,包含了引用计数和weak指向等等信息

随后的一篇我会着重讲写下 isa 相关的东西,飞机票

阅读全文 »

这篇我们来讲一下点击事件,看了不少博客将图文混排、点击事件等等都放在一篇来讲,这样的话可能对于我这种小白来说有点难消化,我就将几种需求放在几篇细细道来

思路

我们通过之前几篇已经可以直接进行图文混排了,这次我们需要给富文本加上点击的方法,点击回调的时候将对应的字符串、绘制范围、字符串的位置等等信息

还是捋一下思路,我们的切入点还是在绘制的时候将要添加的点击事件通过自定义key值添加到富文本的addAttributes中,但是我们value值传入的是自定义的CoreTextClickModel对象,然后在绘制CTRun的时候识别我们的自定义key值,再将对应的绘制区域转为NSValuekey CoreTextClickModel对象为value放到字典里面方便遍历时候查找,然后在点击的时候使用enumerateKeysAndObjectsUsingBlock方法遍历字典中的key判断点击的区域是否在区域内然后再使用对象中的值和执行存储的Block,大概这样的流程,我们还是看一下代码。

阅读全文 »