我通过'泄漏'多次检查了记忆,发现总是存在泄漏。你能救我吗?
代码在这里:
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];
提前感谢任何人。
答案 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。