cocoa - NSAppleScript 泄漏大量内存

标签 cocoa memory-leaks applescript class-method

我有以下类方法来执行 AppleScript:

+ (NSString *) executeAppleScript:(NSString *) scriptToRun{
    NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init];  
    NSAppleScript *appleScriptObject = [[NSAppleScript alloc] initWithSource:scriptToRun];
    NSAppleEventDescriptor *objectReturned = [appleScriptObject executeAndReturnError:nil];
    [appleScriptObject release];
    appleScriptObject = nil;

    NSString *charToReturn = [objectReturned stringValue];

    if (charToReturn == nil ){
        charToReturn = [NSString stringWithString:@"error"];
    }

    [charToReturn retain];
    [thePool drain];

    [charToReturn autorelease];
    return charToReturn;

}

问题是,这会泄漏大量内存。我完全承认我并不完全理解 Cocoa 中的内存分配,所以我希望有人能够向我解释为什么即使使用自动释放池也会如此泄漏。

非常感谢任何帮助。

最佳答案

NSAppleEventDescriptor *objectReturned = [appleScriptObject executeAndReturnError:nil];

永远不要这样做。如果您错误地使用此方法(不太可能)或给它一个错误的脚本(很有可能)或某些内容在其他应用程序端不起作用(很可能),您将无法找出问题所在。让框架告诉您出了什么问题。

另外,nil 在这里是错误的常量。 nil 是对象指针类型的空指针; Nil 用于 Class 值,NULL 用于其他所有值。

    charToReturn = [NSString stringWithString:@"error"];

这已经是一个字符串。您不需要用它创建另一个字符串。

The problem is, this is leaking tons of memory.

您是否已通过 Instruments 验证您确实泄漏了源自此方法的 AppleScript 相关对象?

我在方法中看不到任何看起来错误的东西。该池应该是不必要的,但您对它的使用是有效且正确的。

您可以尝试使用 OSAKit,特别是它的 OSAScript 类。虽然没有文档记录,但这两个类的接口(interface)几乎相同。

关于cocoa - NSAppleScript 泄漏大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121795/

相关文章:

MacOS - 获取管理员密码的合法方法

shell - 从与 Applescript 相同的文件夹中运行 PKG 文件

applescript - 如何根据标签或标识符编写按钮单击脚本

macos - 如何根据自动布局contentView的最小尺寸自动调整NSWindow的大小

objective-c - NSDateFormatter stringFromDate 不返回字符串

ios - NSDateFormatter localizedStringFromDate dateStyle 结果

Java内存泄漏示例

objective-c - UIImage 导致内存泄漏

java - 了解 Android 应用程序中的内存泄漏

java - 如何使用 Applescript 或 Java 检查 Mac 上安装的 Adob​​e flash Player?