我使用NSProxy来模拟一个类,并希望挂起类的所有调用。但是只有类外部调用的方法被钩住,没有在类中调用的方法。下面是一些类似我的代码:
在my 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来处理类的所有方法,因为我认为它过于繁琐,也不是一个好方法。
发布于 2014-10-23 00:12:11
我想您误解了NSProxy的概念。NSProxy代表一个类,它本身并不是任何东西。应该使用NSProxy的方式是,您只需调用代理上的所有方法,就好像它是它所代表的类一样。
在代码中,而不是:
foo = mock;
[foo outsideCalled];做:
[mock outsideCalled];这是我的全部代码:
#import <Foundation/Foundation.h>
@interface TBTestClass : NSObject
- (void)outsideCalled;
- (void)insideCalled;
@end
@implementation TBTestClass
- (void)outsideCalled;
{
NSLog(@"TBTestClass:outsideCalled");
[self insideCalled];
}
- (void)insideCalled;
{
NSLog(@"TBTestClass:insideCalled");
}
@end
@interface TBClassMock : NSProxy
@property (retain) id target;
@end
@implementation TBClassMock
@synthesize target;
- (void)dealloc
{
self.target = nil;
}
- (id)init
{
self.target = nil;
return self;
}
-(void)forwardInvocation:(NSInvocation *)anInvocation
{
if([self.target respondsToSelector:[anInvocation selector]]){
[anInvocation invokeWithTarget:self.target];
}
}
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
return [self.target methodSignatureForSelector:selector];
}
@end
int main(int argc, const char **argv)
{
@autoreleasepool {
TBClassMock *mock = [[TBClassMock alloc] init];
TBTestClass *foo = [[TBTestClass alloc] init];
mock.target = foo;
[mock outsideCalled];
[mock release];
[foo release];
}
return 0;
}输出:
2014-10-23 05:35:06.043 a.out[25483:507] TBTestClass:outsideCalled
2014-10-23 05:35:06.047 a.out[25483:507] TBTestClass:insideCalledhttps://stackoverflow.com/questions/23929645
复制相似问题