2
鑑於NSAppleScript
對象總是應該在主線程上運行,我創建了一個小型的「代理」對象來使用:爲什麼NSAppleScript的compileAndReturnError總是成功?
@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
。
爲什麼?