FBAllocationTracker
有两种模式,跟踪对象,基数allocs/deallocs。
主要类分析
FBAllocationTrackerManager
本类是提供给使用者的最外层包装。
1 | @interface FBAllocationTrackerManager : NSObject |
实现中,多是通过FBAllocationTrackerImpl
来完成。
FBAllocationTrackerImpl
1 | AllocationSummary allocationTrackerSummary(); |
这个类本身实现了allocs和deallocs计数,通过Generation
类实现track对象功能,后者下面会说到。
与其他内存监控相关库类似,首先需要 hook alloc
和 dealloc
。这部分逻辑大同小异。
准备 - 将 allocWithZone
与 dealloc
的函数实现,复制到准备好的空方法上
1 | void prepareOriginalMethods(void) { |
开始 - 用自己的alloc和dealloc替换系统的
1 | void turnOnTracking(void) { |
关闭 - 用一开始保存的系统方法,再替换回去
1 | void turnOffTracking(void) { |
自定义的alloc
和dealloc
方法除了调用系统实现外,额外调用了记录该类的方法。
1 | + (id)fb_newAllocWithZone:(id)zone |
incrementAllocations
做两件事,将该对象的allocs记数+1。如果启用了generation
,就将对象记录到generation
中。incrementDeallocations
是相反的步骤。
1 | void incrementAllocations(__unsafe_unretained id obj) { |
Generation
generation主要是用来记录对象。因为可以分代记录。所以generation中有两个集合对象。每一代的对象,记录在同一个GenerationMap
中。所有的GenerationMap
都存在GenerationList
中。markGeneration
会创建一个新的GenerationMap
。
总结
FBAllocationTracker
通过对alloc
和dealloc
的hook。记录创建和销毁的对象。这部分和其他内存相关的监控类似。此外借鉴了 instruments 工具中 allocation 部分的 markgeneration,提供了分代记录的功能。实现也比较容易,通过集合来存储generation。每次记录对象,就从集合中取最后一个generation来添加即可。