首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS: NSProxy无法挂起类内部调用的方法

iOS: NSProxy无法挂起类内部调用的方法
EN

Stack Overflow用户
提问于 2014-05-29 09:08:09
回答 1查看 566关注 0票数 2

我使用NSProxy来模拟一个类,并希望挂起类的所有调用。但是只有类外部调用的方法被钩住,没有在类中调用的方法。下面是一些类似我的代码:

在my AppDelegate.mTBClassMock中是NSProxy的子类。

代码语言:javascript
复制
TBClassMock *mock = [[TBClassMock alloc] init];
TBTestClass *foo = [[TBTestClass alloc] init];
mock.target = foo;

foo = mock;
[foo outsideCalled];

在我的TBTestClass.m

代码语言:javascript
复制
- (void)outsideCalled
{
    [self insideCalled];
}

- (void)insideCalled
{

}

在我的TBClassMock.m

代码语言:javascript
复制
- (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来处理类的所有方法,因为我认为它过于繁琐,也不是一个好方法。

EN

回答 1

Stack Overflow用户

发布于 2014-10-23 00:12:11

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

在代码中,而不是:

代码语言:javascript
复制
foo = mock;
[foo outsideCalled];

做:

代码语言:javascript
复制
[mock outsideCalled];

这是我的全部代码:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
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
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23929645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档