Edited at

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

More than 3 years have passed since last update.

前回のメモリ不足によるアプリが勝手に終了してしまう対応が出来た!

と思い、色々アプリで遊んでいたら新たな問題発生。


現象

アプリを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の処理が走らないようにする必要があります。

実際の関連処理は下記に記述しました。

今回の対応で追加した部分は、追加と記述してあります。


AppDelegate.h

#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

// 〜省略〜

@property (strong, nonatomic) ViewController *viewController;

@end



AppDelegate.m

#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; // 追加(実行する)
}



ViewController.h

// 〜省略〜

@interface ViewController : UIViewController
// 〜省略〜
@property (assign, nonatomic) bool mOpenGLRun; // 追加(OpenGL処理実行フラグ)
@end


ViewController.m

#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シミュレータでの情報を追加しました。