NSAppleScript утечка тонны памяти - PullRequest
1 голос
/ 08 ноября 2010

У меня есть следующий метод класса для выполнения 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;

}

Проблема в том, что это утечка тонны памяти. Я полностью признаю, что я не совсем понимаю распределение памяти в Какао, поэтому я надеялся, что кто-то сможет объяснить мне, почему это так протекает, даже с пулом автоматического выпуска.

Любая помощь очень ценится.

1 Ответ

1 голос
/ 08 ноября 2010
NSAppleEventDescriptor *objectReturned = [appleScriptObject executeAndReturnError:nil];

Никогда не делай этого.Если вы используете этот метод неправильно (маловероятно) или дадите ему плохой сценарий (вполне возможно), или что-то не работает на другом приложении (очень вероятно), вы не сможете выяснить, в чем проблема.Пусть фреймворк скажет вам, что не так.

Плюс, nil здесь неправильная константа.nil - нулевой указатель для типов указателя объекта;Nil для Class значений, а NULL для всего остального.

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

Это уже строка.Вам не нужно создавать еще одну строку с ним.

Проблема в том, что это утечка тонны памяти.

Подтвердили ли вы с помощью инструментов, что вы на самом делеутечка объектов, связанных с AppleScript, которые возникают в этом методе?

Я не вижу ничего в методе, который выглядит неправильно.Пул должен быть ненужным, но его использование является правильным и правильным.

Вместо этого вы можете попробовать использовать OSAKit, особенно его класс OSAScript.Это не задокументировано, но интерфейсы двух классов практически одинаковы.

...