1

假设我希望能够拦截对 UIViewController 子类的任何方法调用。

首先,我 swizzle+(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:'
4

1 回答 1

0

从错误看来,编码人员只乐于接受从该阶段返回的不同类,initCoder:而不是在该alloc阶段的过程中更早。

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

当您使用它时,请查看导致您的异常的堆栈跟踪,它会让您对这个兔子洞的深度有更多的了解。

于 2018-02-04T02:24:32.210 回答