2010-11-08 66 views
0

的噸我有下面的類的方法來執行一個AppleScript:NSAppleScript泄漏內存

+ (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中的內存分配,所以我希望有人能夠向我解釋爲什麼即使使用autorelease池,這也是如此漏洞。

任何幫助,非常感謝。

回答

1
NSAppleEventDescriptor *objectReturned = [appleScriptObject executeAndReturnError:nil]; 

永遠不要這麼做。如果你使用這種方法是錯誤的(不太可能),或者給它一個錯誤的腳本(很可能),或者在另一個應用程序的最後(很可能)不起作用,你將無法找出問題所在。讓框架告訴你什麼是錯的。

加,nil這裏是錯誤的常數。 nil是對象指針類型的空指針; NilClass值,NULL爲其他值。

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

這已經是一個字符串。你不需要用它創建另一個字符串。

問題是,這是泄漏噸的內存。

您是否使用儀器驗證過實際上是否泄露了源自此方法的與AppleScript相關的對象?

我看不到任何錯誤的方法。游泳池應該是不必要的,但是你對它的使用是有效和正確的。

您可以嘗試使用OSAKit,特別是其OSAScript類。它沒有記錄,但兩個類的接口幾乎相同。

+0

是的,儀器是我被告知這是漏水的地方。另外,這讓我很驚訝,這個類方法佔用了大量的分配(我們沒有發佈)。 – 2010-11-08 07:27:31

+0

使用OSAAScript的優點是什麼? – 2010-11-08 07:28:39

+0

Andrew J. Freyer:可能不會泄漏。 – 2010-11-08 15:00:04