iOSアプリ開発:サスペンド時のEXC_BAD_ACCESS

投稿者: | 投稿日時: 2014/10/20 00:59 | 更新日時: 2020/8/8 22:07

Qiitaで書いていた記事をお引っ越ししてきました。
3277views、7LGTMありがとうございました。
今後はこちらで更新していきます。

前回のメモリ不足によるアプリが勝手に終了してしまう対応が出来た!
と思い、色々アプリで遊んでいたら新たな問題発生。

現象

アプリをXcodeから端末へ転送&実行し、
アプリが起動したらホームボタンを押し、アプリをサスペンド状態にした所下記記述で[EXC_BAD_ACCESS]発生していました。

// mContext…EAGLContext*
[mContext presentRenderbuffer:GL_RENDERBUFFER];

調査

iOSシミュレータでは確認出来ませんでした。(PC側の問題で最新のXcodeにしていないからかも?)
※ちなみに、iOSシミュレータのバージョンは6.0 (369.2)でした。

実機はiOSバージョン6.1.6で、こちらではエラーが発生します。

ViewController上にOpenGLで描画をしていますが、
どうやらバックグラウンドに入った後なのにOpenGLの処理が走ってしまっているようです。

対応

バックグラウンド中はOpenGLの処理が走らないようにする必要があります。
実際の関連処理は下記に記述しました。
今回の対応で追加した部分は、追加と記述してあります。

#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

// 〜省略〜

@property (strong, nonatomic) ViewController *viewController;

@end
#import "AppDelegate.h"

#import "ViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 〜省略〜
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    // 〜省略〜
}

// サスペンド
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    self.viewController.mOpenGLRun = false;  // 追加(実行しない)
}

// レジューム
- (void)applicationWillEnterForeground:(UIApplication *)application
{
    self.viewController.mOpenGLRun = true;  // 追加(実行する)
}
// 〜省略〜
@interface ViewController : UIViewController
// 〜省略〜
@property (assign, nonatomic) bool mOpenGLRun;  // 追加(OpenGL処理実行フラグ)
@end
#import "ViewController.h"
// 〜省略〜
@implementation ViewController

@synthesize mOpenGLRun;  // 追加

- (void)viewDidLoad
{
    [super viewDidLoad];
    mOpenGLRun = true;  // 追加
    // 〜省略〜
}

- (void)Test
{
    if (mOpenGLRun == true) {  // 追加
        // OpenGL関連の処理
    }                          // 追加
}

前からこうだったのか全然記憶にありません…。
他の処理でも何か出てきそうなので気を付けます。

更新履歴

  • 14/10/20 1:11 更新
    調査に、iOSシミュレータでの情報を追加しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください