让我们说我希望能够拦截对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:'
答案 0 :(得分:0)
从错误看来,编码员似乎很乐意接受从initCoder:
返回的不同类,而不是alloc
阶段过程中的早期。
可能值得查看NSSecureCoding
以获取有关整个过程的更多详细信息。
当你在它的时候,看看导致你的异常的堆栈轨道,它会让你更深入地了解这个兔子洞的深度。