我想设计一个类 ( TrackingClass
),它负责跟踪对另一个类 ( TrackedClass
) 的某些方法的调用,即根据我的理解设置方法。
假设我用我感兴趣@selectors
的实例方法加载了一个数组TrackedClass
。这是我想运行的伪代码:
@implementation BCTrackedClass
-(void)doA
{
}
@end
和
@implementation BCTrackingClass
#import "BCTrackingClass.h"
#import "BCTrackedClass.h"
#include <objc/runtime.h>
#include <objc/objc-runtime.h>
@implementation BCTrackingClass
void myMethodIMP(id self, SEL _cmd);
void myMethodIMP(id self, SEL _cmd)
{
//NSLog(@"_cmd : %@",NSStringFromSelector(_cmd));
[BCTrackingClass logCallForMethod:NSStringFromSelector(_cmd)];
objc_msgSend(self,
NSSelectorFromString([NSString stringWithFormat:@"tracked%@",NSStringFromSelector(_cmd)]));
}
+(void)setUpTrackingForClass:(Class)aClass andMethodArray:(NSArray*)anArray //Array of selectorsStrings of methods to track
{
for (NSString* selectorString in anArray)
{
SEL selector = NSSelectorFromString(selectorString);
SEL trackedSelector = NSSelectorFromString([NSString stringWithFormat:@"tracked%@",selectorString]);
class_addMethod(aClass,
trackedSelector,
(IMP) myMethodIMP, "v@:");
//Swizzle the original method with the tracked one
Method original = class_getInstanceMethod(aClass,
selector);
Method swizzled = class_getInstanceMethod(aClass,
trackedSelector);
method_exchangeImplementations(original, swizzled);
}
}
+(void)logCallForMethod:(NSString*)aSelectorString
{
NSLog(@"%@",aSelectorString);
}
@end
从理论上讲,我只是缺少可以有效创建这个新实例方法的代码trackedSelector
。我能做到吗?
编辑
我用一些新信息更新了代码,我越来越近了吗?
编辑 2
如果人们想动态地尝试他们的想法,我会建立一个带有演示应用程序的 Github 存储库。资料来源:Github 上的 BCTrackingClass
编辑 3
我终于想出了代码的工作版本(参见 Github repo,或以上)。我的下一个问题是:我希望我的类是基于实例的(目前,我所有的方法都是类方法),这样我就可以为@property NSMutableDictionnary*
类的实例分配一个属性以进行调用记录。我不确定如何实现这一目标。有什么想法吗?