Можно ли перехватить весь класс метода на любом подклассе UIViewController?
Допустим, я хотел иметь возможность перехватывать любые вызовы методов для подкласса 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 ответ
Из ошибки видно, что кодер только рад принять другой класс, возвращенный из initCoder:
а не ранее в процессе на alloc
этап.
Может быть стоит посмотреть NSSecureCoding
для более подробной информации о всем процессе.
Пока вы это делаете, посмотрите на дорожку стека, которая привела к вашему исключению, она даст вам немного больше понимания того, насколько глубока эта кроличья нора.