首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSAppleScript泄漏大量内存

NSAppleScript泄漏大量内存
EN

Stack Overflow用户
提问于 2010-11-08 14:47:03
回答 1查看 567关注 0票数 1

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

代码语言:javascript
复制
+ (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中的内存分配,所以我希望有人能够向我解释为什么即使使用自动释放池也会如此泄漏。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-08 15:07:35

NSAppleEventDescriptor *对象返回= appleScriptObject执行和返回错误:nil;

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

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

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

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

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

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

我在这个方法中看不到任何看起来有问题的地方。这个池应该是不必要的,但是您对它的使用是有效和正确的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4121795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档