-
mach-o动态注入原理
mach-o动态注入原理 本文主要讲解开源工具yololib的实现原理,超级简单,源码总共也就200多行,并无多大技术含量,主要是为了记录备忘命令// 命令基本用法yololib <mach-o> <dylib file>入口代码 可以看出,这里是记录了2个路径,然后调用了inject_file函数函数:inject_file 步骤: fopen打开mach-o fread读取mach-o信息 根据读取到的bu...…
-
iOS启动优化之二进制重排
启动优化 关于启动优化,在客户端开发中是一个老生常谈的话题,图片压缩/删除代码等方式都已经老掉牙了,一般的面试中也回答这些方案,在众多面试者中也无亮点。 下面的文章主要来讲讲,利用二进制重排的方案,来做优化启动时间。概念 在讲重排之前,我们需要了解几个概念。 虚拟内存和物理内存 物理内存:内存条(硬件)上的地址就叫物理地址,以前的计算机都是通过CPU访问物理内存拿到数据的,这样存在安全问题(金手指?),而且随着软件发展速度快于硬件速度,物理内存也越发不够…… ...…
-
iOS逆向开发
iOS逆向开发 现在越狱的同学越来越少了,因为苹果经过这么多年借鉴越狱开发者的功能使得iOS本身已经很方便,以至于用户没有太大的必要去越狱了。 但是作为一名iOS开发者,逆向开发还有必要的,不管是学习他人的App还是自己想做一些功能,例如微信抢红包啥的。 下面所提到的所有逆向都支持安装在非越狱的iPhone上准备工具 一台已越狱的iPhone(用来砸壳):本文用的是iOS13.2.2 yololib:https://github.com/gaoshilei/yololib fr...…
-
iOS代码测试覆盖率(一)初探
Code Coverage 我们平时开发过程中,有多少同学有纠结过这些问题: 我们写的代码或功能,测试同学有没有测试过呢? 测试同学是否把所有case都跑过了呢? 测试同学有没有漏测了什么功能呢? 我们设计的代码有没有多余的? 其实这些疑问不是怀疑自己或他人的工作能力,只是我们希望自己的代码能够被全部测试,从而不会出现线上的故障,一个体量庞大的App若在线上出现一个故障,影响面有多广可想而知。 像之前苹果没有封杀热修复的时候,若我们的代码覆盖率能够做到...…
-
XTerminal - XCode终端命令插件
###XTerminal是什么? 它就是终端Terminal,只不过它是简单阉割版,部分命令暂时不能支持。 它虽是终端,但不止于终端,会集成各种快捷命令 插件下载地址在本文最后###为什么要造一个XTerminal? Apple很吝啬,始终不肯将terminal嵌入XCode中,像Android Studio,IDEA等都支持了。 我们是否需要它? 假如git操作常用SourceTree等客户端,可能对此插件需求不高。 当然我们也可以使用XCode的Behavio...…
-
iOS中OOM底层原理探究
什么是OOM 它是out-of-memory的首字母集合,字面意思就是内存超了。 同学们都知道,iOS App中内存超了,系统会把App直接杀死,一种另类的Crash;有兴趣的同学可以尝试下,把一些UIImage自行缓存到内存中,收到Memory Warning也不要去释放,占用内存超过一定的容量就会出现OOM。什么是Jetsam OOM的管理就是通过Jetsam来实现的,Jetsam是用独立运作的,每一个进程都有一个"high water mark"(HWM),一旦内存超过这个值就...…
-
AutoReleasePool实现原理探究
什么是AutoreleasePool 一听到AutoreleasePool,有些同学可能会与MRC联系起来,其实它并不是属于MRC时代的,当你创建一个项目的时候,可以去main.m看下,是用AutoreleasePool包起来了;还有当我们写一个for循环的时候,考虑到内存可以及时释放的时候我们也会主动加上AutoreleasePool,所以ARC也是可以用AutoreleasePool的。Main函数int main(int argc, char * argv[]) { @aut...…
-
Objective-C中伪指针Tagged Pointer
Tagged Pointer 什么是TagPointer? Tagged Pointer专门用来存储小的对象,例如NSNumber和NSDate Tagged Pointer指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已。所以,它的内存并不存储在堆中,也不需要malloc和free 在内存读取上有着3倍的效率,创建时比以前快106倍 Apple为要引入Tagged Pointer呢? 我们知道N...…
-
iOS Runtime深度解析
什么是Runtime? Objective-C是基础C语言扩展出来的一门语言,并且是加入了面向对象特性和Smalltalk式的消息发送机制;然后这个扩展的核心,就是Runtime,它是Objective-C面向对象和动态机制的基石。 Runtime源码地址为什么说Objective-C是一门动态语言? 在说为什么之前首先来看下什么是静态语言,什么是动态语言? 静态语言:强类型语言,静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据...…
-
iOS Runloop源码深度解析
Apple - CFRunloop源码链接什么是RunLoop? 按照字面理解,run loop就是跑圈的意思 实际上在App中,它就是一个事件循环,main函数就是一个最大的runloop。 //伪代码while (true) { Source* source = SleepAndWaitWakeUp(); Event* event = GetEventBySource(source); HandleEvent(event);} Runloop遵循:有事呼叫我,没事我睡觉。 ...…