它是NSAppleScript中的漏洞吗?

时间:2013-08-06 01:00:18

标签: objective-c applescript memory-leaks

我通过'泄漏'多次检查了记忆,发现总是存在泄漏。你能救我吗?

代码在这里:

NSAppleScript* startFinder = [[NSAppleScript alloc] initWithSource:
                                  @"tell application \"Finder\"\n"
                                  @"    delay 1\n"
                                  @"    try\n"
                                  @"        «event GKKJload»\n"
                                  @"    on error msg number num\n"
                                  @"        display dialog \"another try\"  buttons{\"i see\"} default button 1 with icon caution  with title \"aaa\"\n"
                                  @"    end try\n"
                                  @"end tell"];
[startFinder executeAndReturnError:nil];
[startFinder release];

提前感谢任何人。

2 个答案:

答案 0 :(得分:1)

NSAppleScript因泄漏记忆而臭名昭着。导入OSAKit框架并使用OSAScript代替NSAppleScript(其余代码可以保持不变)。

答案 1 :(得分:0)

这是我做的事情。我开发了一个模型 - 视图 - 控制器,用于编辑,编译和运行脚本。

在像您这样的情况下,您只能使用该模型。在我的ScriptModel类中,它是另一层抽象,但我认为它很好。我可以通过将ScriptModel实现更改为NSAppleScript或OSAScript来更改对所有AppleScripts的调用。

- (IBAction)test01:(id)sender
{
    ScriptModel* startFinder = [[ScriptModel alloc] initWithSource:
                                  @"tell application \"Finder\"\n"
                                  @"    delay 1\n"
                                  @"    try\n"
                                  @"        «event GKKJload»\n"
                                  @"    on error msg number num\n"
                                  @"        display dialog \"another try\"  buttons{\"i see\"} default button 1 with icon caution with title \"aaa\"\n"
                                  @"    end try\n"
                                  @"end tell"];
    ScriptResult *scriptResult = [startFinder run];
}

我正在使用ARC,所以我相信我的代码可以正常工作。我无法在ARC中调用发布方法。

您需要考虑的另一个选择是既不使用NSAppleScript而不使用OSAScript,也不使用AppleScript源,而只是使用Scripting Bridge来使用Objective-C调用:

/*

Scripting Bridge for Objective-C
http://www.macosxautomation.com/applescript/features/scriptingbridge.html

Although the Objective-C language has existing mechanisms for sending Apple Events, the new Scripting Bridge architecture greatly simplifies the coding necessary to query and control scriptable applications.
*/

#import <Foundation/Foundation.h>
#import <ScriptingBridge/ScriptingBridge.h>
#import "iTunes.h"

int main()
{
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];

NSLog(iTunes.currentTrack.name);
}

我认为,如果您想要向用户打开脚本以自定义应用程序,那么从Objective-C中运行AppleScripts是有意义的。我正在考虑将Scripting Bridge用于其他所有内容,而不是在我的Objective-C代码中嵌入AppleScripts。