检测 NSObject 对象持有的强指针

关注仓库,及时获得更新:iOS-Source-Code-Analyze 在上一篇文章中介绍了 FBRetainCycleDetector 的基本工作原理,这一篇文章中我们开始分析它是如何从每一个对象中获得它持有的强指针的。 如果没有看第一篇文章这里还是最好看一下,了解一下 FBRetainCycleDetector 的工作原理,如何在 iOS 中解决循环引用的问题。 FBRetainCycleDetector 获取对象的强指针是通过 FBObjectiveCObject 类的 - allRetainedObjects 方法,这一方法是通过其父类 FBObjectiveCGraphElement 继承过来的,只是内部有着不同的实现。 allRetainedObjects 方法... »

Author image iOS

如何在 iOS 中解决循环引用的问题

关注仓库,及时获得更新:iOS-Source-Code-Analyze 稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来。 但是遇到下面这样的情况,如果只看其实现代码,也很难仅仅凭借肉眼上的观察以及简单的推理就能分析出其中存在的循环引用问题,更何况真实情况往往比这复杂的多: testObject1.object = testObject2; testObject1.secondObject = testObject3; testObject2.object = testObject4; testObject2.secondObject = testObject5; testObject3.object = testObject1;... »

Author image iOS

动态修改 C 语言函数的实现

关注仓库,及时获得更新:iOS-Source-Code-Analyze Objective-C 作为基于 Runtime 的语言,它有非常强大的动态特性,可以在运行期间自省、进行方法调剂、为类增加属性、修改消息转发链路,在代码运行期间通过 Runtime 几乎可以修改 Objecitve-C 层的一切类、方法以及属性。 真正绝对意义上的动态语言或者静态语言是不存在的。 C 语言往往会给我们留下不可修改的这一印象;在之前的几年时间里,笔者确实也是这么认为的,然而最近接触到的 fishhook 使我对 C 语言的不可修改有了更加深刻的理解。 在文章中涉及到一个比较重要的概念,就是镜像(image);在 Mach-O 文件系统中,所有的可执行文件、dylib 以及... »

Author image iOS

如何在 Objective-C 的环境下实现 defer

关注仓库,及时获得更新:iOS-Source-Code-Analyze 这篇文章会对 libextobjc 中的一小部分代码进行分析,也是如何扩展 Objective-C 语言系列文章的第一篇,笔者会从 libextobjc 中选择一些黑魔法进行介绍。 对 Swift 稍有了解的人都知道,defer 在 Swift 语言中是一个关键字;在 defer 代码块中的代码,会在作用域结束时执行。在这里,我们会使用一些神奇的方法在 Objective-C 中实现 defer。 如果你已经非常了解... »

Author image iOS

『零行代码』解决键盘遮挡问题(iOS)

关注仓库,及时获得更新:iOS-Source-Code-Analyze 这篇文章会对 IQKeyboardManager 自动解决键盘遮挡问题的方法进行分析。 最近在项目中使用了 IQKeyboardManager 来解决 UITextField 被键盘遮挡的问题,这个框架的使用方法可以说精简到了极致,只需要将 IQKeyboardManager 加入 Podfile,然后 pod install 就可以了。 pod 'IQKeyboardManager' 这篇文章的题目《零行代码解决键盘遮挡问题》来自于开源框架的介绍: Codeless drop-in... »

Author image iOS

关联对象 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... »

成熟的夜间模式解决方案

关注仓库,及时获得更新:iOS-Source-Code-Analyze 从开始写 DKNightVersion 这个框架到现在已经将近一年了,目前整个框架的设计也趋于稳定。 其实夜间模式的实现就是相当于多主题加颜色管理。而最新版本的 DKNightVersion 已经很好的解决了这个问题。 在正式介绍目前版本的实现之前,我会先简单介绍一下 1.0 时代的 DKNightVersion 的实现,为各位读者带来一些新的思路,也确实想梳理一下这个框架是如何演变的。 我们会以对 backgroundColor 为例说明整个框架的工作原理。 方法调剂的版本 如何在不改变原有的架构,甚至不改变原有的代码的基础上,为应用优雅地添加夜间模式成为很多开发者不得不面对的问题。这也是 1.0 时代的 DKNightVersion... »

Author image iOS

懒惰的 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 底层的实现有一定的了解,你应该会知道... »