假设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。
为什么?
发布于 2009-06-04 04:08:27
在脚本编辑器中尝试。“foo”编译得很好,只是不能运行。
尝试将“*”作为您的编译测试脚本。
顺便说一句,运行脚本也会引发错误(如脚本编辑器中所示)。确保你能处理好。
https://stackoverflow.com/questions/948380
复制相似问题