代码之家  ›  专栏  ›  技术社区  ›  Paul J. Lucas

为什么NSAppleScript的compileAndReturnError总是成功?

  •  2
  • Paul J. Lucas  · 技术社区  · 17 年前

    鉴于 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
    

    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];
    

    compileAndReturnError YES 和 m_errorDict 仍然 nil .

    为什么?

    1 回复  |  直到 17 年前
        1
  •  1
  •   Peter Hosey    17 年前

    在脚本编辑器中尝试。foo编译得很好;它就是跑不动。

    尝试 *

    顺便说一句,运行脚本也会引发错误(正如您在脚本编辑器中看到的那样)。确保你处理好了。