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、ではなくオブジェクトになりますUIApplicationNSNotificationCenterクラスリファレンスを参照してください

于 2011-06-28T17:31:19.640 に答える