オブジェクトNSAppleScript
は常にメイン スレッドで実行されることになっているため、使用する小さな「プロキシ」オブジェクトを作成しました。
@interface AppleScriptProxy : NSObject {
NSAppleScript *m_script;
NSDictionary *m_errorDict;
}
- (id) init;
- (void) compileScript:
(NSString*)script;
- (void) dealloc;
- (NSDictionary*) errorDict;
- (BOOL) failed;
- (void) runScript:
(id)notUsed;
@end
@implementation AppleScriptProxy
- (id) init
{
self = [super init];
m_errorDict = nil;
m_script = nil;
return self;
}
- (void) dealloc
{
//[m_errorDict release];
[m_script release];
[super dealloc];
}
- (void) compileScript:
(NSString*)source
{
m_script = [[NSAppleScript alloc] initWithSource:source];
if ( m_script )
if ( [m_script compileAndReturnError:&m_errorDict] ) {
cerr << "compiled" << endl;
[m_script retain];
} else {
cerr << "not compiled" << endl;
m_script = nil;
}
}
- (NSDictionary*) errorDict
{
return m_errorDict;
}
- (BOOL) failed
{
return !m_script || m_errorDict;
}
- (void) runScript:
(id)notUsed
{
[m_script executeAndReturnError:nil];
}
@end
次に、AppleScript をコンパイルして実行するには:
NSString *const script = /* some script */;
[proxy
performSelectorOnMainThread:@selector(compileScript:)
withObject:script waitUntilDone:YES];
if ( [proxy failed] ) {
NSDictionary *errorDict = [proxy errorDict];
NSString const *const errorMsg = errorDict ?
[errorDict objectForKey:NSAppleScriptErrorMessage] :
@"NSAppleScript initWithSource failed";
cerr << [errorMsg UTF8String] << endl;
return 1;
}
[proxy retain];
[proxy
performSelectorOnMainThread:@selector(runScript:)
withObject:nil waitUntilDone:NO];
[proxy autorelease];
有効なスクリプトをコンパイルすると、期待どおりに動作します。ただし、「foo」などの意味不明なスクリプトをコンパイルすると、compileAndReturnError
失敗しません。つまり、戻り、YES
そのままm_errorDict
ですnil
。
なんで?