2011-06-28 8 views
1

私は次の通知に登録しています:私はしかし、単純にこれを登録することで、私はEXC_BAD_ACCESSS時にアプリを取得、これは前のiOSのバージョンのようにすべての状況で呼び出されていないことを知っているIOS4でUIApplicationWillTerminateNotificationを処理する方法は? iOS4をで

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

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

を終了します。それでも、私のアプリがiOS3.0 +をサポートしているため、削除できません。これをどうすれば処理できますか?

UPDATE:ここではクラッシュログです:。。あなたは何ができるか

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 
+0

EXC_BAD_ACCESSはおそらく無関係です。私は 'UIApplicationWillTerminateNotification'がmustitaskingをサポートするデバイスでは送信されないとは思わない。 'applicationWillEnterBackground:'またはそれに対応する通知にコードがありますか? –

+0

奇妙なことに、 'applicationWillEnterBackground'ですべてのコードを削除しても、同じことが起こります。その上で、' UIApplicationWillTerminateNotification'の通知を取り除いても問題ありません。また、これはシミュレータ上ではなくデバイス上でのみ発生します。質問をクラッシュログに更新します。 –

答えて

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]; 
} 
+1

OKこれは完璧な意味を持ち、もちろん動作します。ただし、オブザーバを削除すると、終了メソッドは(自然に)呼び出されることはありませんが、 'UIApplicationWillTerminateNotification'通知に応答する必要があります。私はそれを別のクラスに入れるべきですか? –

+0

私はApplication Delegateで必要な呼び出しを追加して作業しました。助けてくれてありがとう。 –

+0

これはその場所であり、既に通知オブザーバを追加することなくメソッドをサポートしています。 – Joe

0

は、iOSのバージョンを検出し、そのV場合である3.0のVならば、appWillTerminateを使用し、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]]; 
} 
+0

ちょうど私の答えを変更した、それは間違った笑だったことに気づいた。 –

関連する問題