对UIApplication进行子类化以覆盖sendEvent会导致崩溃

Dav*_*vid 11 iphone objective-c ipad ios4 ios

我正在尝试子类UIApplication来捕获所有触摸事件,这用于查看用户是否是afk.无论如何,它在您第一次启动应用程序时效果很好.如果你把它放在后台并再次打开它2次然后它会崩溃.我不知道是什么原因引起的.我在[super sendEvent:event]上获得了EXEC_BAD_ACCESS;

我的子类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
Run Code Online (Sandbox Code Playgroud)

的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;
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*s C 6

有没有理由先调用超类方法?如果你正在拦截,你应该最后调用它。

那可能是你的问题。我还覆盖了 sendEvent 以拦截我的应用程序的所有事件并且没有问题。

如果您首先调用 super 方法,它将把它传递给所有 UIResponder,这些 UIResponder 最终可能会吃掉您的事件,从而导致 EXEC_BAD_ACCESS。此外,正如 DavidNeiss 建议的那样,消除 super 调用下方的行。如果您仍然收到错误的访问信号,则可能是另一个视图或控制器导致它。您需要堆栈跟踪以找出它的位置。


小智 4

要获取 EXEC_BAD_ACCESS 的确切原因,请在应用程序中使用 nszombieenabled。此链接将指导您使用它。 http://iosdevelopertips.com/debugging/tracking-down-exc_bad_access-errors-with-nszombieenabled.html