1. 二进制重排
不能 可以取到 c
函数,oc
方法,block
,swift
方法 但是可以用 -finstrument-functions
在编译期插桩 “hook”,或者使用并不完美但成本最低的静态扫描方案。
embedded
)的 dylib
,加载内嵌 dylib
性能开销较大dylib
和使用静态库(static archives
),减少 dylib
的使用个数dylib
,但是要注意 dlopen()
可能造成一些问题,且实际上懒加载做的工作会更多在 dylib
的加载过程中,系统为了安全考虑,引入了 ASLR
(Address Space Layout Randomization)技术和代码签名。由于ASLR的存在,镜像(Image
,包括可执行文件、dylib
和 bundle
)会在随机的地址上加载,和之前指针指向的地址(preferred_address
)会有一个偏差(slide
),dyld
需要修正这个偏差,来指向正确的地址。
clas
s)、方法(selector
)、分类(category
)的数量C++
虚函数的数量(创建虚函数表有开销)swiftStructs
(内部有优化,符号数量更少)Objc setUp
Initializers
+load
方法里做事情,尽量把这些事情推迟到 +initiailize
C++
静态全局变量的个数tabBar
控制器的 viewDidAppear
方法里,并且保证只执行一次(按项目结构,放在合适的地方)viewDidLoad
和 viewWillAppear
做太多事情,这 2 个方法执行完,第一个页面才能显示,部分可以延迟创建的视图应做延迟创建/懒加载处理Link Map File
中文直译为链接映射文件,它是在 Xcode 生成可执行文件的同时生成的链接信息文件,用于描述可执行文件的构造部分,包括了代码段和数据段的分布情况
Path
是生成可执行文件的路径。Arch
指代架构类型。Object Files
列举了可执行文件里所有的 obj
以及 tbd
。每一行代表对文件的编号。Section
包含了 Address
、Size
、Segment
以及 Section
。Mach-O
文件中的虚拟地址最终会被映射到物理地址上,这些地址会被分为不同的段类型: TEXT
、 DATA
以及 LINKEDIT
等。各个段的含义如下:
TEXT
包含了被执行的代码。这些代码是只读、可执行DATA
包含了包含了将会被更改的数据,例如全局变量、静态变量等,可读写,但是不可执行LINKEDIT
包含了加载程序的元数据,比如函数名称和地址,只读。Segment
又被划分成了不同的Section
,不同的Section
存储了不同的信息,例如objc _ methname
为方法的名称
Dead Stripped Symbols
DYLD_PRINT_STATISTICS
main()
函数里用变量 StartTime didFinishLaunchingWithOptions
再获取一下当前时间+load
: 程序启动后,在系统的 main
函数调用之前,系统就会加载所有的 load
方法,提前进行一些资源包的配置或者 hook
,(可以打断点看看结果,本人亲测过)+initialize
: 当前类或者其子类未被初始化过时会首次调用,若以后当前类或者子类再多次初始化时不会再调用,一般提前为初始化做一些工作+alloc
: 系统为当前类分配内存时调用,在C语言中就是 malloc
这一步-initWithCoder
: 通过 storyBoard
方式实例化的 vc,需要经过反序列化,这个方法会被调用-initWithNibName:bundle
: 通过 xib
文件或者 init
方法实例化的 vc,这个方法都会被调用,其实 init
方法最终都会走该方法-init
: 通过纯代码实例化Vc会调用,其最终会调用 initWithNibName:bundle:
方法-loadView
: 实例化Vc后,可以加载一些系统常规的View-viewDidLoad
: 一般加载自定义的view或者初始化属性,视图加载完毕后会调用-viewWillAppear
: 视图即将出现会调用-viewWillDisappear
: 视图即将消失会调用-viewWillLayoutSubviews
: 视图加载完毕后即将要布局-viewDidLayoutSubviews
: 视图加载完毕后布局也完成了-didReceiveMemoryWarning
: 加载视图时,内存消耗太大,出现内存警告,会调用-dealloc
: 实例化被销毁,进行内存的回收会调用可变对象复制:
都是深拷贝,但是 copy
返回的对象是不可变的。
对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。
~/Library/Preferences
下,用 plist
文件存储
是由 SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议
对称加密+非对称加密这两种方式,我们可以用非对称加密的方式来传输对称加密过程中的密钥,之后我们就可以采取对称加密的方式来传输数据
可以让 HEAD
这个指针指向其他的地方 它有三种模式,soft
, mixed
, hard
保留工作目录,并把重置 HEAD
所带来的新的差异放进暂存区reset --soft
会在重置 HEAD
和 branch
时,保留工作目录和暂存区中的内容,并把重置 HEAD
所带来的新的差异放进暂存区。
reset
不加参数(mixed
):保留工作目录,并清空暂存区reset
如果不加参数,那么默认使用 --mixed
参数。它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset
所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed
)放在工作目录中」。
重置 stage
区和工作目录reset --hard
会在重置 HEAD
和 branch
的同时,重置 stage
区和工作目录里的内容。当你在 reset
后面加了 --hard
参数时,你的 stage
区和工作目录里的内容会被完全重置为和 HEAD
的新位置相同的内容。换句话说,就是你的没有 commit
的修改会被全部擦掉。
作者:徐晓珊、朱浦睿、小木偶