1

在 iOS4 中,我正在注册以下通知:

[[NSNotificationCenter defaultCenter]   addObserver:self
                                                 selector:@selector(appWillTerminate:)
                                                 name:UIApplicationWillTerminateNotification
                                                 object:[UIApplication sharedApplication]];

-(void)appWillTerminate:(UIApplication *) app {
    NSLog(@"terminate");
}

我知道在所有情况下都不会调用它,就像在以前的 iOS 版本中一样,但是,只需注册它,我就会EXC_BAD_ACCESSS在应用程序退出时得到一个。不过,我无法删除它,因为我的应用支持 iOS3.0+。我该如何处理?

更新:这是崩溃日志:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000011
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x0000441c objc_msgSend + 20
1   Foundation                      0x00015432 _nsnote_callback + 150
2   CoreFoundation                  0x000271da __CFXNotificationPost_old + 390
3   CoreFoundation                  0x00026e7a _CFXNotificationPostNotification + 122
4   Foundation                      0x00004720 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
5   Foundation                      0x0000de3a -[NSNotificationCenter postNotificationName:object:] + 14
6   UIKit                           0x000bef10 -[UIApplication _terminateWithStatus:] + 164
7   UIKit                           0x000be1b0 -[UIApplication _handleApplicationSuspend:eventInfo:] + 1980
8   UIKit                           0x0007e4a0 -[UIApplication handleEvent:withNewEvent:] + 3620
9   UIKit                           0x0007d470 -[UIApplication sendEvent:] + 60
10  UIKit                           0x0007ccf8 _UIApplicationHandleEvent + 6804
11  GraphicsServices                0x00005dd8 PurpleEventCallback + 1024
12  CoreFoundation                  0x00035e40 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 22
13  CoreFoundation                  0x00035dfe __CFRunLoopDoSource1 + 158
14  CoreFoundation                  0x0002809e __CFRunLoopRun + 574
15  CoreFoundation                  0x00027d74 CFRunLoopRunSpecific + 220
16  CoreFoundation                  0x00027c82 CFRunLoopRunInMode + 54
17  GraphicsServices                0x00004e84 GSEventRunModal + 188
18  UIKit                           0x00004f8c -[UIApplication _run] + 564
19  UIKit                           0x000024cc UIApplicationMain + 964
4

3 回答 3

1

确保删除任何正在侦听终止通知的类中的观察者。如果您不删除通知,它将尝试将其发布到已释放的对象,然后您的应用程序将崩溃。您不应该因为收听不存在的通知而崩溃,它只是不会被调用。

//YourClass
-(id)init
{
    if((self = [super init]))
    {
        [[NSNotificationCenter defaultCenter]   addObserver:self
                                             selector:@selector(appWillTerminate:)
                                             name:UIApplicationWillResignActiveNotification
                                             object:[UIApplication sharedApplication]];
    }
    return self;
}

-(void)appWillTerminate:(NSNotification *)note {
    NSLog(@"terminate");
}

-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    //Other releases
    [super dealloc];
}
于 2011-06-28T17:27:39.487 回答
0

您可以做的是检测 iOS 版本,如果它的 v. 3.0 然后使用 appWillTerminate,如果它的 v. 4.0 使用 appWillResignActive 或 appDidEnterBackground,例如:

NSString *ver = [[UIDevice currentDevice] systemVersion];
if([ver isEqualToString:@"3.0"]){
    //Device is running 3.0
    [[NSNotificationCenter defaultCenter]   addObserver:self
                                             selector:@selector(appWillTerminate:)
                                             name:UIApplicationWillTerminateNotification
                                             object:[UIApplication sharedApplication]];
}
else if([ver isEqualToString:@"4.0"]){
    //4.0
    [[NSNotificationCenter defaultCenter]   addObserver:self
                                             selector:@selector(appWillTerminate:)
                                             name:UIApplicationWillResignActiveNotification
                                             object:[UIApplication sharedApplication]];
}
于 2011-06-28T17:00:13.067 回答
0

传递给您的appWillTerminate:方法的第一个参数将是一个NSNotification对象,而不是您的UIApplication. 请参阅NSNotificationCenter 类参考

于 2011-06-28T17:31:19.640 回答