iOS 中的 block 是如何持有对象的

关注仓库,及时获得更新:iOS-Source-Code-Analyze Block 是 Objective-C 中笔者最喜欢的特性,它为 Objective-C 这门语言提供了强大的函数式编程能力,而最近苹果推出的很多新的 API 都已经开始原生的支持 block 语法,可见它在 Objective-C 中变得越来越重要。 这篇文章并不会详细介绍 block 在内存中到底是以什么形式存在的,主要会介绍 block 是如何持有并且释放对象的。文章中的代码都出自 Facebook 开源的用于检测循环引用的框架... »

对象是如何初始化的(iOS)

关注仓库,及时获得更新:iOS-Source-Code-Analyze 在之前,我们已经讨论了非常多的问题了,关于 objc 源代码系列的文章也快结束了,其实关于对象是如何初始化的这篇文章本来是我要写的第一篇文章,但是由于有很多前置内容不得不说,所以留到了这里。 + alloc 和 - init 这一对我们在 iOS 开发中每天都要用到的初始化方法一直困扰着我, 于是笔者仔细研究了一下 objc 源码中 NSObject 如何进行初始化。 在具体分析对象的初始化过程之前,我想先放出结论,以免文章中的细枝末节对读者的理解有所影响;整个对象的初始化过程其实只是为一个分配内存空间,并且初始化 isa_t 结构体的过程。... »

关联对象 AssociatedObject 完全解析

关注仓库,及时获得更新:iOS-Source-Code-Analyze 我们在 iOS 开发中经常需要使用分类(Category),为已经存在的类添加属性的需求,但是使用 @property 并不能在分类中正确创建实例变量和存取方法。 不过,通过 Objective-C 运行时中的关联对象,也就是 Associated Object,我们可以实现上述需求。 写在前面 这篇文章包含了两方面的内容: 使用关联对象为已经存在的类中添加属性 关联对象在底层 Objective-C 中的实现 注:如果你刚刚入门 iOS 开发,笔者相信了解第一部分的内容会对你的日常开发中有所帮助,不过第二部分的内容可能有些难以理解。... »

黑箱中的 retain 和 release

关注仓库,及时获得更新:iOS-Source-Code-Analyze 由于 Objective-C 中的内存管理是一个比较大的话题,所以会分为两篇文章来对内存管理中的一些机制进行剖析,一部分分析自动释放池以及 autorelease 方法,另一部分分析 retain、release 方法的实现以及自动引用计数。 自动释放池的前世今生 黑箱中的 retain 和 release 写在前面 在接口设计时,我们经常要考虑某些意义上的平衡。在内存管理中也是这样,Objective-C 同时为我们提供了增加引用计数的 retain 和减少引用计数的 release 方法。... »

自动释放池的前世今生 ---- 深入解析 autoreleasepool

关注仓库,及时获得更新:iOS-Source-Code-Analyze 由于 Objective-C 中的内存管理是一个比较大的话题,所以会分为两篇文章来对内存管理中的一些机制进行剖析,一部分分析自动释放池以及 autorelease 方法,另一部分分析 retain、release 方法的实现以及自动引用计数。 写在前面 这篇文章会在源代码层面介绍 Objective-C 中自动释放池,以及方法的 autorelease 的具体实现。 从 main 函数开始 main 函数可以说是在整个 iOS... »

上古时代 Objective-C 中哈希表的实现

关注仓库,及时获得更新:iOS-Source-Code-Analyze 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable... »

懒惰的 initialize 方法

关注仓库,及时获得更新:iOS-Source-Code-Analyze 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 写在前面 这篇文章可能是对 Objective-C 源代码解析系列文章中最短的一篇了,在 Objective-C... »

你真的了解 load 方法么?

关注仓库,及时获得更新:iOS-Source-Code-Analyze 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 写在前面 文章的标题与其说是问各位读者,不如说是问笔者自己:我真的了解 + load 方法么?... »

从源代码看 ObjC 中消息的发送

Blog: Draveness 关注仓库,及时获得更新:iOS-Source-Code-Analyze 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 写在前面 如果你点开这篇文章,相信你对 Objective-C... »

深入解析 ObjC 中方法的结构

Blog: Draveness 关注仓库,及时获得更新:iOS-Source-Code-Analyze 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 在上一篇分析 isa 的文章从... »

从 NSObject 的初始化了解 isa

Blog: Draveness 关注仓库,及时获得更新:iOS-Source-Code-Analyze 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 如果你曾经对 ObjC 底层的实现有一定的了解,你应该会知道... »