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

时间:2011-05-02 01:57:24

标签: iphone ios objective-c ipad ios4

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

上获得了EXEC_BAD_ACCESS

My Subclass 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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

不明白“afk”是什么意思。

另一种方法可能是创建自定义手势识别器。它们(手势识别器)应该在将它们作为正常触摸事件处理的一部分转发到视图之前通过触摸事件进行过滤。

答案 3 :(得分:1)

为了简单起见,我会将@“MyUI”直接放入UIApplicationMain调用中。

字符串很可能是你的问题。它在NSAutoreleasePool之外,而这还没有完成。

此外,名称@“MyUI”提示视图控制器,而不是AppDelegate类。看看那个。

答案 4 :(得分:1)

[super sendEvent:event]; //&lt; - 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);
}

这将帮助您找出正确的问题。