NSProxy を使用してクラスをモックし、クラスのすべての呼び出しをフックしたいと考えています。ただし、クラス内で呼び出されたメソッドではなく、クラス外で呼び出されたメソッドのみがフックされます。以下は私のコードのようなものです:
私のAppDelegate.mでは、TBClassMockはNSProxyのサブクラスです
TBClassMock *mock = [[TBClassMock alloc] init];
TBTestClass *foo = [[TBTestClass alloc] init];
mock.target = foo;
foo = mock;
[foo outsideCalled];
私のTBTestClass.m で
- (void)outsideCalled
{
[self insideCalled];
}
- (void)insideCalled
{
}
私のTBClassMock.m で
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
NSLog(@"Signature: %@", NSStringFromSelector(selector));
return [self.target methodSignatureForSelector:selector];
}
-(void)forwardInvocation:(NSInvocation*)anInvocation
{
//... Do other things
[anInvocation invokeWithTarget:self.target];
}
次に、 の呼び出しをログに記録できますが、 の呼び出しを[foo outsideCalled]
ログに記録できません[self insideCalled]
。
のクラスのすべての呼び出しで何かを行うことを目指していますが、//... Do other things
この方法は失敗したようです。これと私の要件を実装するための他の方法についての説明はありますか? クラスのすべてのメソッドを使用してスウィズルしたくないのは、method_exchangeImplementations
それが面倒すぎて良い方法ではないと思うからです。