Подклассификация UIApplication для переопределения sendEvent вызывает сбой - PullRequest
11 голосов
/ 02 мая 2011

Я пытаюсь использовать UIApplication подкласса, чтобы перехватить все сенсорные события, это используется, чтобы увидеть, является ли пользователь afk или нет. В любом случае, он отлично работает при первом запуске приложения. Если вы поместите его в фоновый режим и снова откроете его 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;
}

Ответы [ 5 ]

4 голосов
/ 02 мая 2011

Чтобы получить точную причину EXEC_BAD_ACCESS, используйте nszombieenabled в вашем приложении.Эта ссылка поможет вам его использовать.http://iosdevelopertips.com/debugging/tracking-down-exc_bad_access-errors-with-nszombieenabled.html

4 голосов
/ 04 мая 2011

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

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

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

1 голос
/ 05 ноября 2014

[супер sendEvent: событие]; // <- EXEC_BAD_ACCESS </p>

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

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

/*
- (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);
}

Это поможет вам разобраться в правильной проблеме.

1 голос
/ 14 марта 2012

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

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

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

1 голос
/ 02 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...