FBAllocationTracker 框架详细解析(一)

版本记录

版本号 时间
V1.0 2017.09.26

前言

在APP中,内存是极其宝贵的资源,因此需要我们很好的管理内存的使用,下面介绍一个用于检测目前存活对象的框架,这里先给出 Github - FBAllocationTracker

关于

用于检测目前活着的Objective-C对象的iOS库。

FBAllocationTracker是一种可以用作内存中分配的Objective-C对象的接口的工具。 它可以用于查询给定类的所有实例,或者您可以(如在Instruments中)标记代,并查询仅在一代范围内创建的对象。


安装

1. Carthage

在Cartfile文件中加入

github "facebook/FBAllocationTracker"

然后使用

carthage update --configuration Debug

2. CocoaPods

pod 'FBAllocationTracker'

您只能在Debug构建中完全使用FBAllocationTracker。 这由编译标志控制,可以提供给构建以使其在其他配置中工作。


使用

FBAllocationTracker可以运行在两种模式中:跟踪对象,并只计算allocs / deallocs。 第一个更有趣,我们进行跳转。 当您不想影响性能时,第二个可以被视为对某些统计信息有用。

首先,我们要在我们的运行中启用FBAllocationTracker。 我们可以随时做到。 例如在main.m

#import <FBAllocationTracker/FBAllocationTrackerManager.h>

int main(int argc, char * argv[]) {
  [[FBAllocationTrackerManager sharedManager] startTrackingAllocations];
  [[FBAllocationTrackerManager sharedManager] enableGenerations];
  @autoreleasepool {
      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}

在上面的代码中,startTrackingAllocations将会处理NSObject的+ alloc和-dealloc方法,而enableGenerations将开始跟踪对象的实际实例。

我们可以抓住所有类分配的摘要:

NSArray<FBAllocationTrackerSummary *> *summaries = [[FBAllocationTrackerManager sharedManager] currentAllocationSummary];

FBAllocationTrackerSummary会告诉你,对于给定的类,这个类的多少个实例还活着。随着几代启用(在下面详细解释),您还可以获得给定类的所有实例。

NSArray *instances =[[FBAllocationTrackerManager sharedManager] instancesOfClasses:@[[ViewController class]]];

分代

代是灵感来自Instruments中的Allocations tool。 启用代,我们可以调用[[FBAllocationTrackerManager sharedManager] markGeneration]来标记。 给定markGeneration调用后分配的所有对象将保存在新一代。 我们可以在一个非常简单的例子中看到它:

- (void)someFunction {
  // Enable generations (if not already enabled in main.m)
  [[FBAllocationTrackerManager sharedManager] enableGenerations];
 
  // Object a will be kept in generation with index 0
  NSObject *a = [NSObject new];
  
  // We are marking new generation
  [[FBAllocationTrackerManager sharedManager] markGeneration];
  
  // Objects b and c will be kept in second generation at index 1
  NSObject *b = [NSObject new];
  NSObject *c = [NSObject new];
  
  [[FBAllocationTrackerManager sharedManager] markGeneration];
  
  // Object d will be kept in third generation at index 2
  NSObject *d = [NSObject new];
}

FBAllocationTrackerManager具有API,可以在给定的一代中获取给定类的所有实例。

NSArray *instances =[[FBAllocationTrackerManager sharedManager] instancesForClass:[NSObject class]
                                                                     inGeneration:1];

这可以用于分析分配,例如通过执行用户可能执行的常见任务。 在每个任务之间,我们可以标记新一代,然后验证哪些对象被保留在一代中。

FBAllocationTrackerFBMemoryProfiler中大量使用。 它为FBMemoryProfiler提供数据。 它也是FBRetainCycleDetector的重要来源。

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容