2011-08-09 1 views
1

私のアプリケーションはiOS 4.3.3 iPhone 3GSですばらしい働きをしています。 3.1.3 iPhone 3Gでアプリをテストすると、スプラッシュ画像が表示された直後にプログラムがクラッシュします。デバッガは、ルートビューコントローラの最後のコマンドを指します。awakeFromNibiOS3のapplicationWillEnterForegroundではEXEC_BAD_ACCESSですが、iOS4ではありません

- (void)awakeFromNib 
{ 
    NSLog(@"awakeFromNib"); 
    NSLog(@"applicationWillEnterForeground listened"); 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(applicationWillEnterForeground:) 
               name:UIApplicationWillEnterForegroundNotification 
               object: nil]; 
} 

2011-08-09 15:56:24.585 AppName[4401:207] awakeFromNib 
2011-08-09 15:56:24.602 AppName[4401:207] applicationWillEnterForeground listened 
Program received signal: “EXC_BAD_ACCESS”. 

この問題を回避するのに役立つはずのiOS 3の覚醒/睡眠に関する特別なことがありますか? iOSデベロッパライブラリから

答えて

3

問題は、識別子UIApplicationWillEnterForegroundNotificationが、iOS 4以降にのみ存在する外部定義の文字列を指していることです。 iOS 3以前では、それはゼロに評価されます。したがって、あなたは通知名のためにnilを渡しているので、オブザーバーを追加するとクラッシュすることになります。

これは2通りの方法で修正できます。あなたが直接あなたのコードに通知の名前の文字列値を使用することができます。私はそれが何であるかだかどうかわからないんだけど

[[NSNotificationCenter defaultCenter] 
addObserver:self 
selector:@selector(applicationWillEnterForeground:) 
name:@"UIApplicationWillEnterForeground" // might not be correct 
object:nil]; 

、あなたはドキュメントをチェックしたり、それを正確に確認するためにのNSLogを使用する必要があります。

より良いオプションは、最初の識別子の値をチェックし、それだけがサポートされている場合は、リスナーを追加することです:

if (UIApplicationWillEnterForegroundNotification) { 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(applicationWillEnterForeground:) 
    name:UIApplicationWillEnterForegroundNotification 
    object:nil]; 
} 
5

UIApplicationWillEnterForegroundNotification

アプリケーションがアクティブなアプリケーションになるため その途中でバックグラウンド状態を去る直前に投稿されました。 通知のオブジェクトはUIApplicationオブジェクトです。 userInfo 辞書はありません。

可用性

のiOS 4.0で利用可能以降

おそらくEXEC_BAD_ACCESSが発生します。そのコード行を削除するとクラッシュしますか?

+0

行を削除し、それを修正するが、どのように私は、iOS 3でこのイベントをシミュレートしていますか?ユーザーがアプリを開くたびにテーブルビューを更新する必要があります。 Facebookはこれを行います。それはあなたのニュースフィードが開かれるたびに更新されます。 – JoJo

+0

通知名は文字列です。サポートされていないものをリッスンするとアプリがクラッシュすることはなく、単に通知されることはありません。 – benzado

+0

代わりに 'applicationDidBecomeActive'を使用して回避策を作成しました。私はちょうど 'didBecomeActive'と' willEnterForeground'を区別する必要がありました。 'willEnterForeground'がアプリの起動時に*最初の*時間を起動しない点を除いて、どちらもほぼ同じ時刻に起動されます。 – JoJo

関連する問題