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来添加即可。