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

验证 HTTPS 请求的证书(五)

Blog: Draveness 关注仓库,及时获得更新:iOS-Source-Code-Analyze 自 iOS9 发布之后,由于新特性 App Transport Security 的引入,在默认行为下是不能发送 HTTP 请求的。很多网站都在转用 HTTPS,而 AFNetworking 中的 AFSecurityPolicy 就是为了阻止中间人攻击,以及其它漏洞的工具。 AFSecurityPolicy 主要作用就是验证 HTTPS... »

AFNetworkReachabilityManager 监控网络状态(四)

Blog: Draveness 关注仓库,及时获得更新:iOS-Source-Code-Analyze AFNetworkReachabilityManager 是对 SystemConfiguration 模块的封装,苹果的文档中也有一个类似的项目 Reachability 这里对网络状态的监控跟苹果官方的实现几乎是完全相同的。 同样在 github 上有一个类似的项目叫做 Reachability 不过这个项目由于命名的原因可能会在审核时被拒绝。 无论是 AFNetworkReachabilityManager,苹果官方的项目或者说 github 上的 Reachability,它们的实现都是类似的,而在这里我们会以 AFNetworking... »

处理请求和响应 AFURLSerialization(三)

Blog: Draveness 关注仓库,及时获得更新:iOS-Source-Code-Analyze 在前面两个部分已经分析过 AFNetworking 是对 NSURLSession 的封装,也了解了它是如何发出请求的,在这里我们对发出请求以及接收响应的过程进行序列化,这涉及到两个模块: AFURLResponseSerialization AFURLRequestSerialization 前者是处理响应的模块,将请求返回的数据解析成对应的格式。而后者的主要作用是修改请求(主要是 HTTP 请求)的头部,提供了一些语义明确的接口设置 HTTP 头部字段。 我们首先会对 AFURLResponseSerialization 进行简单的介绍,因为这个模块使用在 AFURLSessionManager 也就是核心类中,而后者... »

AFNetworking 的核心 AFURLSessionManager(二)

Blog: Draveness 关注仓库,及时获得更新:iOS-Source-Code-Analyze AFURLSessionManager 绝对可以称得上是 AFNetworking 的核心。 负责创建和管理 NSURLSession 管理 NSURLSessionTask 实现 NSURLSessionDelegate 等协议中的代理方法 使用 AFURLSessionManagerTaskDelegate 管理进度 使用 _AFURLSessionTaskSwizzling 调剂方法... »

AFNetworking 概述(一)

Blog: Draveness 关注仓库,及时获得更新:iOS-Source-Code-Analyze 在这一系列的文章中,我会对 AFNetworking 的源代码进行分析,深入了解一下它是如何构建的,如何在日常中完成发送 HTTP 请求、构建网络层这一任务。 AFNetworking 是如今 iOS 开发中不可缺少的组件之一。它的 github 配置上是如下介绍的: Perhaps the most important feature of... »

神奇的 BlocksKit (二)

关注仓库,及时获得更新:iOS-Source-Code-Analyze 这篇文章『神奇的 BlocksKit』的第二部分,关于第一部分的内容在这里: 神奇的 BlocksKit(一) 神奇的 BlocksKit(二) 动态代理 动态代理这部分可以说是 BlocksKit 的精华。它使用 block 属性替换 UIKit 中的所有能够通过代理完成的事件,省略了设置代理和实现方法的过程,让对象自己实现代理方法,而且这个功能的实现是极其动态的。 其实不是对象自己实现的代理方法,只是框架为我们提供的便捷方法,不需要构造其它对象就能完成代理方法的实现,具体我们会在后面详细地解释。 下面是这部分几个关键的类: A2BlockInvocation 的主要作用是存储和转发 block... »