JavaScriptCore で JSContext の作成に失敗しないようにする

Cocoa プログラミング

JavaScriptCore で頻繁に JSContext を作成していると、ときどき EXC_BAD_ACCESS が発生することがありました。

そんなときの対処法を見つけたので記しておきます。


JavaScriptCore を使っているとき、頻繁にJSContext のインスタンスを作成しているとEXC_BAD_ACCESS が発生することがあります。

このとき、あらかじめインスタンス変数にJSVirtualMachineクラス のインスタンスを用意しておいて、それを使ってJSContextクラス を作成することで、エラーが発生しなくなるようでした。

#import <JavaScriptCore/JavaScriptCore.h>

@interface EzBuilder : NSObject

@property (readonly,strong) JSVirtualMachine* vm;
- (void)build;

@end

@implementation EzBuilder

- (instancetype)init
{
	self = [super init];
	
	if (self)
	{
		_vm = [[JSVirtualMachine alloc] init];
	}
	
	return self;
}

- (void)build
{
	JSContext* js = [[JSContext alloc] initWithVirtualMachine:self.vm];
	
	:
}

@end

JSContext を何回か作成するような場合は、面倒でもこのようにinitWithVirtualMachine:メソッド を使って、使用する仮想マシンを明示的に指定するのが良さそうですね。