我有以下类方法来执行 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/