0

我通过“泄漏”多次检查内存,发现总是存在泄漏。你能帮帮我吗?

代码在这里:

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

提前感谢任何人。

4

2 回答 2

1

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

于 2013-08-06T18:41:07.763 回答
0

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

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

- (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 中调用 release 方法。

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

/*

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 用于其他所有事情,而不是将 AppleScripts 嵌入到我的 Objective-C 代码中。

于 2013-08-06T20:02:32.460 回答