gpt4 book ai didi

ios - iOS:NSProxy无法 Hook 在类本身内部调用的方法

转载 作者:行者123 更新时间:2023-12-01 17:12:09 25 4
gpt4 key购买 nike

我使用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来混淆类的所有方法,因为我认为这太麻烦了,不是一个好方法。

最佳答案

我想您已经误解了NSProxy的概念。 NSProxy代表一类,它本身不是任何东西。应该使用NSProxy的方式是,您只需在proxy上调用所有方法,就好像它代表它所代表的类一样。

在您的代码中,而不是:

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:insideCalled

关于ios - iOS:NSProxy无法 Hook 在类本身内部调用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23929645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com