我有以下类方法来执行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中的内存分配,所以我希望有人能够向我解释为什么即使使用自动释放池也会如此泄漏。
任何帮助都是非常感谢的。
发布于 2010-11-08 15:07:35
NSAppleEventDescriptor *对象返回= appleScriptObject执行和返回错误:nil;
永远不要这样做。如果您错误地(不太可能)使用此方法,或者给它一个糟糕的脚本(很有可能),或者其他应用程序端的某些东西无法工作(很有可能),您将无法找出问题所在。让框架告诉你哪里出了问题。
另外,nil在这里是错误的常量。nil是对象指针类型的空指针;Nil用于Class值,NULL用于其他所有类型。
charToReturn = [NSString stringWithString:@"error"];
这已经是一个字符串。你不需要用它来创建另一个字符串。
问题是,这会泄漏大量的内存。
您是否验证过Instruments是否确实泄漏了源自此方法的AppleScript相关对象?
我在这个方法中看不到任何看起来有问题的地方。这个池应该是不必要的,但是您对它的使用是有效和正确的。
您可以尝试使用OSAKit,特别是它的OSAScript类。它没有文档记录,但是这两个类的接口几乎相同。
https://stackoverflow.com/questions/4121795
复制相似问题