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用であり、その他すべて用です。ClassNULL

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

これはすでに文字列です。それを使用して別の文字列を作成する必要はありません。

問題は、これが大量のメモリをリークしていることです。

このメソッドに由来する AppleScript 関連のオブジェクトを実際にリークしていることを Instruments で確認しましたか?

メソッドに間違っているように見えるものは何もありません。プールは不要なはずですが、その使用は有効で正しいものです。

代わりに、OSAKit、特にその OSAScript クラスを使用してみてください。文書化されていませんが、2 つのクラスのインターフェースはほとんど同じです。

于 2010-11-08T07:07:35.310 に答える