2009-06-04 28 views
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不會失敗,即它返回YESm_errorDict仍然是nil

爲什麼?

回答

1

在腳本編輯器中嘗試。 「foo」編譯得很好;它只是不運行。

嘗試使用「*」作爲編譯測試腳本。

順便說一句,運行腳本也會引發錯誤(正如您在腳本編輯器中看到的一樣)。確保你處理。

相關問題