我有以下类方法来执行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中的内存分配,所以我希望有人能够向我解释为什么即使使用自动释放池也会如此漏洞。
非常感谢任何帮助。
答案 0 :(得分:1)
NSAppleEventDescriptor *objectReturned = [appleScriptObject executeAndReturnError:nil];
不要这样做。如果您使用此方法错误(不太可能)或给它一个糟糕的脚本(非常可能)或某些东西在另一个应用程序的末尾(非常可能)不起作用,您将无法找出问题所在。让框架告诉你什么是错的。
另外,nil
是错误的常量。 nil
是对象指针类型的空指针; Nil
用于Class
个值,NULL
用于其他所有值。
charToReturn = [NSString stringWithString:@"error"];
这已经是一个字符串了。您无需使用它创建另一个字符串。
问题是,这会泄漏大量内存。
您是否已经使用Instruments验证您实际上是否泄漏了源自此方法的AppleScript相关对象?
我在方法中看不到任何看起来错误的东西。该池应该是不必要的,但您对它的使用是有效和正确的。
您可以尝试使用OSAKit,尤其是其OSAScript类。它没有记录,但两个类的接口几乎相同。