- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用NSProxy模拟一个类,并希望钩住该类的所有调用。但是,仅钩住在类外部调用的方法,而没有在类内部调用的方法。以下是我的代码:
在我的 AppDelegate.m 中, TBClassMock 是的子类。NSProxy
TBClassMock *mock = [[TBClassMock alloc] init];
TBTestClass *foo = [[TBTestClass alloc] init];
mock.target = foo;
foo = mock;
[foo outsideCalled];
- (void)outsideCalled
{
[self insideCalled];
}
- (void)insideCalled
{
}
- (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/
我想通过打印选择器和参数来拦截发送到代理对象的消息。即使代理没有实现它们并且没有目标对象。请帮忙。我已经查看了几个选项和 Apple 文档,但他们假设您已经知道目标对象。我想干净地完成此操作,而不会出
我想编写一个代理,通过 TCP 将方法调用转发到另一个对象,而无需 NSConnection 和 NSDistanceObject 内容。我想要的是我自己的协议(protocol)。 问题在于,子类化
我正在研究苹果 API 向我提供的一些更可疑的对象(例如 mutableArrayValueForKeyPath),这让我想知道苹果多久给我一次我认为是某个对象的东西,但实际上是只是一个 NSProx
Fabric 告诉我很多用户在我的应用程序中遇到以下崩溃 如果展开,我会看到以下堆栈 Fatal Exception: NSInvalidArgumentException 0 CoreFoun
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我需要用我自己的实现替换对象中的方法。例如, Person *p; // some object NSMutableArray *array = [NSMutableArray array]; [ar
我有一个 NSProxy 的子类,用于将消息转发到对象实例或 Lua 函数(如果它们是为选择器定义的)。这在大多数情况下都有效。然而,UITableViewController 是完全不同的情况。当我
我一直在想为什么 NSProxy 类如此重要。为什么一个对象需要将它的实例变量保存在其他对象中?我需要示例来了解何时使用它。谢谢! 最佳答案 NSProxy 在需要委托(delegate)拦截时很有用
我使用方法调配将所有方法调用包装在一个具有一些额外功能的类中。具体来说,我是: 检查此方法调用所需的对象是否在缓存中 如果缓存中有该对象,则将其返回。 如果没有,分派(dispatch)到原始实现,填
我正在使用OCMock尝试测试 NSURLConnection 的行为。这是不完整的测试: #include "GTMSenTestCase.h" #import @interface HttpTe
NSProxy的接口(interface)是 public class NSProxy : NSObjectProtocol { public class func alloc() -> Se
我正在尝试通过设置 NSProxy 子类来代替我选择的任何 UIView,向我的 UIView 添加功能(根据状态配置 CALayers)。这是我尝试过的: 在我的 NSProxy 子类中,我有以下代
如何在 Swift 中创建一个 NSProxy 子类? 尝试添加任何 init 方法失败并出现错误:“不能在初始化器之外调用 super 初始化”,或者“在从初始化程序返回之前,不会在所有路径上调用
NSProxy Class Reference是这样说的: Typically, a message to a proxy is forwarded to the real object or cau
我正在使用 AFNetworking 从 openweathermap API 检索天气信息。 let manager = AFHTTPSessionManager() manager.req
在 OCMockito 中,测试替身是使用 NSProxy 实现的。 instance 的替身实现 -respondsToSelector: 如下: - (BOOL)respondsToSelecto
在 ARC 下,我有一个对象 Child,它有一个 weak 属性,parent。我正在尝试为 Child 编写一些测试,并且正在使用 OCMock 模拟其 parent 属性。 在 ARC 下,使用
我在单元测试中使用 OCMock 来模拟 NSManagedObjects。我使用 Mogenerator 为我的核心数据对象生成机器和人类可读的文件。我试图模拟 NSManagedObject 以返
保留在 NSObject 协议(protocol)中声明。 因此NSObject类和NSProxy类实现了它。 然而 NSProxy 和 NSObject 类都有一个分配。 为什么 alloc 没有在
我是一名优秀的程序员,十分优秀!