Можно ли перехватить весь класс метода на любом подклассе 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 для более подробной информации о всем процессе.

Пока вы это делаете, посмотрите на дорожку стека, которая привела к вашему исключению, она даст вам немного больше понимания того, насколько глубока эта кроличья нора.

Другие вопросы по тегам