1

我有以下类方法来执行 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 中的内存分配,所以我希望有人能够向我解释为什么即使使用自动释放池也会如此泄漏。

任何帮助是极大的赞赏。

4

1 回答 1

1
NSAppleEventDescriptor *objectReturned = [appleScriptObject executeAndReturnError:nil];

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

另外,nil这里的常数是错误的。nil是对象指针类型的空指针;Nil是为了Class价值观,NULL也是为了其他一切。

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

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

问题是,这会泄漏大量内存。

您是否使用 Instruments 验证过您实际上正在泄漏源自此方法的 AppleScript 相关对象?

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

您可以尝试使用 OSAKit,尤其是它的 OSAScript 类。它没有记录,但是这两个类的接口几乎相同。

于 2010-11-08T07:07:35.310 回答