一个 Objective-C 单例,用于在运行时进行监控、跟踪和抑制选择器
如果您使用 CocoaPods,这就像
pod 'VMDInstrumenter'
如果您不使用 CocoaPods,只需下载源代码,并将 VMInstrumenter 文件夹的内容复制到您的项目中。您可以 #import "VMDInstrumenter.h"
而无需其他。
检索监控器实例
您可以通过调用来获取一个 VMDInstrumenter
实例
VMDInstrumenter *instrumenter = [VMDInstrumenter sharedInstance];
抑制选择器
然后您可以通过调用来抑制特定类的特定选择器
[instrumenter suppressSelector:@selector(doFoo) forClass:[self class]];
对 [self class]
中后续对 doFoo
的调用将被忽略。
之后,您可以通过调用来恢复被抑制的方法
[instrumenter restoreSelector:@selector(doFoo) forClass:[self class]];
替换实现
您还可以通过来交换方法实现
[instrumenter replaceSelector:@selector(doFoo) ofClass:[self class] withSelector:@selector(doBar) ofClass:[self class]];
这样,对 doFoo
的后续调用实际上将执行 doBar
中的代码。
跟踪选择器
您可以通过调用来跟踪特定选择器的执行(这将自动记录执行的开始-结束)
[instrumenter traceSelector:@selector(doBar) forClass:[self class]];
您还可以通过调用来跟踪特定选择器的执行,只有当它被调用在特定实例上时
[instrumenter traceSelector:@selector(doBar) forObject:fooInstance];
您还可以通过传递要在特定选择器执行前后执行的代码块来监控特定选择器的执行
[instrumenter instrumentSelector:@selector(doBar) forClass:[self class] withBeforeBlock:^{
NSLog(@"Here I am!");
} afterBlock:nil];
关于跟踪,您可以通过来监控只在特定实例上调用的选择器
[instrumenter instrumentSelector:@selector(doBar) forObject:fooInstance withBeforeBlock:^{
NSLog(@"Here I am!");
} afterBlock:nil];
如果您需要跟踪同一类的选定实例上的特定选择器的执行,请不要使用相同的选择器多次调用 traceSelector:forObject:
,但您可以使用方法
[instrumenter traceSelector:@selector(doBar) forInstancesOfClass:[self class] passingTest:^BOOL(id instance) {
//Your test goes here, the parameter instance is the object that got the call
return instance == self;
}];
关于跟踪,您可以使用来监控同一类的选定实例上的选择器调用
[instr instrumentSelector:@selector(doFoo) forInstancesOfClass:[self class] passingTest:^BOOL(id instance) {
//Your test goes here, the parameter instance is the object that got the call
return instance == self;
} withBeforeBlock:^(id instance) {
NSLog(@"Here I am!");
} afterBlock:nil];
对于每个 traceSelector
方法,都有一个变体,您可以不指定 beforeBlock
和 afterBlock
,但仍能从中获得一些好处。这就是通过调用实现
[instr traceSelector:@selector(doFoo) forClass:[self class] withTracingOptions:VMDInstrumenterTracingOptionsAll];
VMDInstrumenterTracingOptions
位字段有以下可能的值(您可以通过按位或来获取您喜欢的组合)
VMDInstrumenterTracingOptionsNone It doesn't do any particular tracing. This is equivalent to just call traceSelector:forClass: or your specific variant
VMDInstrumenterDumpStacktrace It prints the stacktrace on the console, at the time the traced selector is going to be called
VMDInstrumenterDumpObject It prints a dump of the object, with its ivars (and values, when possible), properties (with values) and method list
VMDInstrumenterTraceExecutionTime It records the execution time for the traced selector and prints it on the console
VMDInstrumenterTracingOptionsAll All of above
此产品在 BSD 许可下发布。
这主要是一个实验。请不要将其用于生产代码。