Подклассификация UIApplication для переопределения sendEvent вызывает сбой

Я пытаюсь подкласса UIApplication, чтобы поймать все события касания, это используется, чтобы увидеть, является ли пользователь афкой или нет. Во всяком случае, он отлично работает при первом запуске приложения. Если вы положите его в фоновом режиме и снова откроете его 2 раза, он сработает. Я понятия не имею, что это за причина. Я получаю EXEC_BAD_ACCESS на [super sendEvent: event];

Мой подкласс MyUI:

@implementation MyUI

- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event]; // <-- EXEC_BAD_ACCESS

    if (event.type == UIEventTypeTouches) {
        UITouch *touch = [event allTouches].anyObject;
        if (touch.phase == UITouchPhaseBegan) {
           // Calling some methods
        }
     }
}  
@end

main.m

int main(int argc, char *argv[])
{
    NSString* appClass = @"MyUI";
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, appClass, nil);
    [pool release];
    return retVal;
}

Ответ 2

Есть ли причина, по которой сначала вызывается метод суперкласса? Если вы перехватываете, вы должны называть его последним.

Это может быть вашей проблемой. Я также переопределяю sendEvent, чтобы перехватить все события в моем приложении и не имею проблем.

Если вы сначала вызовете метод super, он передаст его всем UIRsответчикам, которые могут в конечном итоге съесть ваше событие, в результате чего EXEC_BAD_ACCESS. Кроме того, поскольку DavidNeiss предлагает исключить строки под супер-вызовом. Если вы по-прежнему получаете сигнал плохого доступа, его вероятный другой вид или контроллер по линии, вызывающей его. Вам нужно собрать трассировку, чтобы узнать, где она находится.

Ответ 3

Не понимаю, что означает "афк".

Другой подход может заключаться в создании пользовательского распознавателя жестов. Они (распознаватели жеста) должны фильтровать события касания до того, как они будут отправлены в представление, как часть обычной обработки событий.

Ответ 4

Просто для простоты, я бы поместил @MyUI непосредственно в вызов UIApplicationMain.

Строка, скорее всего, ваша проблема. Это вне NSAutoreleasePool, и это просто не сделано.

Кроме того, имя @MyUI указывает на контроллер вида, а не на класс AppDelegate. Посмотрите на это.

Ответ 5

[super sendEvent: event];//< - EXEC_BAD_ACCESS

означает, что ошибка в вашем классе.

Для блока тестирования

/*
- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event]; // <-- EXEC_BAD_ACCESS

    if (event.type == UIEventTypeTouches) {
        UITouch *touch = [event allTouches].anyObject;
        if (touch.phase == UITouchPhaseBegan) {
           // Calling some methods
        }
     }
} 
*/

все-таки вы получите эту ошибку. В любое время, если вы получаете ошибку при переопределении sendEvent попробуйте заблокировать все методы переопределения и еще раз проверьте эту ошибку или нет специально для этой строки [super sendEvent:event];. Я также придерживался этой ошибки и не ошибся в этом методе. Ошибка была найдена в applicationDidFinishLaunching. Всегда сохраняйте свой код в методе try catch

@try {

}
@catch (NSException *exception) {
    NSLog(@"Exception => %@",exception);
}

Это поможет вам понять правильную проблему.