测试已测试 | ✓ |
语言语言 | Objective C++Objective C++ |
许可 | BSD |
发布上次发布 | 2016年5月 |
由 Dave Lee、Grzegorz Pstrucha、Jeremie Marguerie 维护。
一个用于内省当前内存中存在的 Objective-C 对象的 iOS 库。
FBAllocationTracker
是一个可以将 objective-C 在内存中分配的对象作为接口使用的工具。它可以用来查询给定类所有实例,或者您可以通过 Instruments 中那样标记代数并查询仅在一代范围内创建的对象。
FBAllocationTracker
可以运行在两种模式:跟踪对象,仅计数分配/释放。第一种模式更有趣,我们会立即进入。第二种模式在您不想影响性能时可以用于某些统计信息。
首先,我们想在运行时启用 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]]];
查看 FBAllocationTrackerManager API,了解您还可以做什么。
代数是受到 Instruments 中 Allocations 工具启发的想法。启用代数后,我们可以通过调用 [[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];
这可以用来分析分配,例如通过执行用户可能执行的一些常见任务。在每次任务之间,我们可以标记一个新的代数,然后验证给定的代中有哪些对象被保留。
FBAllocationTracker
在 FBMemoryProfiler 中得到广泛使用。它为 FBMemoryProfiler
提供数据。它也是为 FBRetainCycleDetector 候选人提供重要来源。
有关如何协助的说明,请参阅 CONTRIBUTING 文件。
FBAllocationTracker
采用 BSD 许可协议。我们还提供额外的 专利许可。