从 Git 仓库中克隆出指定 tag 处的指定文件背景项目中的一个模块从源码打包成了动态库 pod,这个模块迭代了十来年,打包出来的 Framework 对应的 dSYM 压缩后的体积也达到了 150MB。为方便管理,我们将 dSYM 和动态库放到同一个 git 仓库中,并通过 git-lfs 来管理体积大的二进制文件和 dSYM 文件。 目标日常开发时,Framework 的调用方通过 pod 'xxxx' 引入此动态库,要尽量 2022-02-23 开发技巧 Git
逆向学习笔记 - 部分场景的 ARM64 汇编指令本文将对高级语言中常见的基础语句块进行汇编代码调试,如全局变量、局部变量、if / for / while 语句、switch、指针类型等,以加深印象和理解,方便在查看二进制反汇编代码时能快速识别并准确地“翻译”为高级语言伪代码。 全局变量 & 局部变量下面代码中,全局变量和局部变量是如何取值并参与运算的呢?12345678int globalVal = 0xabcdef;int su 2021-04-04 汇编 汇编 底层 笔记
逆向学习笔记 - ARM64 汇编入门开个坑,记录一下系统性地学习 iOS 逆向的过程,从汇编入门开始。在这之前对汇编基础和逆向有一些了解,所以文章只当做查缺补漏,记录本人认为有意思的点——虽然这个“缺”和“漏”有点大😁 以下汇编笔记基于 ARM64 整理,可能不完全适用于基于其他架构 我们写的文本代码,被编译器和链接器按照一定的格式转变成二进制字节流文件,在被操作系统加载执行时,文件又以一条条机器码的形式被映射到内存中,这些机 2021-03-01 汇编 汇编 底层 笔记
算法 - 下三角填充( Swift 学习 & 过渡设计)最近在学习 Swift,正好拿算法入手,以期在实际编码过程中,能有更多的对 Swift 编程思想的体会。另外,这个月快过完了,又得交公粮了,就用“下三角矩阵填充的 Swift 实现”对付一下吧🥴 矩阵下三角填充,在矩阵中按照自然数递增填充数,使得矩阵中下三角被填满。如图下三角填充算不上什么难的算法,但本着学习 Swift 的目的,所以下面过渡设计了一番,实现了通用的任意方向的三角的填充算法。 2021-01-25 算法 Swift 算法 Swift Swift 学习
数据结构与算法 - 双链表 - LRU上篇文章中复习了双链表的基本操作,接下来使用双链表实现 LRU 算法 LRU(Least Recently Used):最近最少使用,优先淘汰最长时间未被使用的数据,是页面置换算法的一种,广泛地应用于计算机领域的各种基础组件中,如 iOS 中的内存管理和 NSCache 组件。 实现的要点: 标记出最近使用和最久没有使用的数据。我们可以将最近使用的数据移动到链表头部,最久没有使用过的就会 2020-12-20 算法 算法 双链表 Swift
数据结构与算法 - 双链表 - 大整数相加工作中虽然主打 Objc,但是接触 Swift 后就很难回去,在用 Swift 写过一些 Demo 程序时,她的优雅和简练以及它所反映的编程思想深深地让人迷恋。本系列文章会用 Swift 实现一些常见算法,以期待能够在实战中持续学习 Swift 并对基础数据结构算法做整理和回顾。 样式双链表是在单链表的基础上,扩展了一个前向指针,使得双链表可以在两个方向自由地移动。下面将定义一个存放单个数字的 2020-11-28 算法 算法 双链表 Swift
对 OC 神经病院入学考试题目的理解这是一个老话题,各种文章已经泛滥了,我为什么还要来掺和呢?个人觉得网上的那些解释存在跳跃性,不能和已有的认知联系起来,下面是我探讨这个问题的记录,对我认为比较陌生的地方力求足够详细地解释。如发现错误之处希望得到您能指正! 上代码1234567891011121314151617181920@interface Sark : NSObject@property (nonatomic, copy) 2020-10-22 底层 底层 iOS Runtime Objective-C
使用 Xcode 编译规则提升代码质量随着项目的迭代,工程代码量越来越大,如果使用 Xcode 默认的编译警告级别,越来越多的隐患将被隐藏在代码中,这类隐患代码大部分来自旧代码,也有部分来自日常开发的代码,特别是在模块重构时,这些代码大概率会成为 bug 的发源地,也将会是后期优化的绊脚石。 由于 Objective-C 语言的动态性,部分不安全的代码写法在编译时并不会报错(error),只是会产生警告 (warning),而后者 2020-09-22 开发技巧 Xcode
OC runtime 中的 load 和 initialize我们的程序编译成二进制后,在启动时需要初始化运行环境,包括类环境的初始化,涉及到类相关方法的加载,其中很重要的两个方法有 +load 和 +initialize,这两个方法都会在初始化的时候被调用,相信大家都不陌生,但是涉及到底层细节时可能就不太熟悉了,比如它们是如何被调用的?为什么会是这样的调用?它们在写业务代码时能用来做什么?本文将通过 runtime 和 dyld 源码来回答这些问题 官 2020-09-09 底层 底层 iOS Runtime Objective-C
给 Xcode 工程的 AppIcon 添加版本信息需求由来日常开发迭代中,为了能让需求能够被及时验收、让问题 / bug 能得到及时验证,我们编写的代码需要持续地交付,为此我们搭建了 Jenkins 自动工具来交付版本。 有些时候我们会对同一个 App 并行开发不同的版本,随着不同功能的不同版本的同一 App 的交付(内部测试),产品同学和测试同学可能会搞不清楚自己手机上安装的到底是哪个版本、对应着哪个需求或问题要被验证,他们当然可以进入 App 2020-08-13 开发技巧 工具 iOS Python 脚本 Xcode