是否有可能拦截任何UIViewController子类

时间:2018-02-03 21:48:30

标签: ios objective-c uiviewcontroller nsproxy swizzle

让我们说我希望能够拦截对UIViewController子类的任何方法调用。

首先,我调动+(instancetype)alloc method并检查当前实例isKindOfClass:[UIViewController class]。如果是的话,我继续用目标实例化我的代理。

///swizzled Alloc
+ (instancetype)monitoredAlloc {
     id obj = [self monitoredAlloc];
     if([obj isKindOfClass:[UIViewController class]]) {
        id proxy = [PMGProxy proxyWithObject:obj];
        return proxy;
     }
    return [self monitoredAlloc];
}
 ---------------------------------------
/// Proxy class
@implementation PMGProxy

+ (instancetype)proxyWithObject:(id)obj {
    PMGProxy *proxy = [self alloc];
    proxy.obj = obj;
    return proxy;
}


- (void)forwardInvocation:(NSInvocation *)invocation
{
    [invocation setTarget:_obj];
    [invocation invoke];
}

-(NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    return [self.obj methodSignatureForSelector:sel];
}

- (Class)class {
    return [self.obj class];
}

问题是我崩溃了,所以我希望我的代理的实现是错的......我做错了什么?

以下是例外:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'This coder requires that replaced objects be returned from initWithCoder:'

1 个答案:

答案 0 :(得分:0)

从错误看来,编码员似乎很乐意接受从initCoder:返回的不同类,而不是alloc阶段过程中的早期。

可能值得查看NSSecureCoding以获取有关整个过程的更多详细信息。

当你在它的时候,看看导致你的异常的堆栈轨道,它会让你更深入地了解这个兔子洞的深度。