URL-finder using a lot of memory I'm trying to get the URL of the browser with Mac OS X app. I wrote some AppleScript and am trying to use it in Cocoa. The problem is, when I watch it with instruments, memory is increasing, and at the end of 3-4 hours it's nearly 20MB.


First generation

Second generation (5 min. later)





#import "AppDelegate.h"
#import &lt;Carbon/Carbon.h&gt;

@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    [NSTimer scheduledTimerWithTimeInterval:1
                                     target:self
                                   selector:@selector(collect)
                                   userInfo:nil
                                    repeats:YES];
}

- (void)collect{
    [self runWithEvent];
}

- (void)runWithEvent{
    NSURL *URL = [[NSBundle mainBundle] URLForResource:@"frontmostapptitle" withExtension:@"scpt"];
    if (URL) {
        NSAppleScript *appleScript = [[NSAppleScript alloc] initWithContentsOfURL:URL error:NULL];

        NSAppleEventDescriptor *returnDescriptor = [self lookUpRunningApp];

        NSDictionary *error = nil;
        NSAppleEventDescriptor *resultEventDescriptor = [appleScript executeAppleEvent:returnDescriptor error:&amp;error];

        if (! resultEventDescriptor) {
            NSLog(@"%s AppleScript run error = %@", __PRETTY_FUNCTION__, error);
        }
        else {
            NSLog(@"%@", [self stringForResultEventDescriptor:resultEventDescriptor]);
        }
    }
}


- (NSAppleEventDescriptor *)lookUpRunningApp{
    // target
    ProcessSerialNumber psn = {0, kCurrentProcess};
    NSAppleEventDescriptor *target = [NSAppleEventDescriptor descriptorWithDescriptorType:typeProcessSerialNumber bytes:&amp;psn length:sizeof(ProcessSerialNumber)];

    // function
    NSAppleEventDescriptor *function = [NSAppleEventDescriptor descriptorWithString:@"LookUpRunningApp"];

    // event
    NSAppleEventDescriptor *event = [NSAppleEventDescriptor
                                     appleEventWithEventClass:kASAppleScriptSuite
                                     eventID:kASSubroutineEvent
                                     targetDescriptor:target
                                     returnID:kAutoGenerateReturnID
                                     transactionID:kAnyTransactionID];
    [event setParamDescriptor:function forKeyword:keyASSubroutineName];
    return event;
}

- (NSString *)stringForResultEventDescriptor:(NSAppleEventDescriptor *)resultEventDescriptor
{
    NSString *result = nil;

    if (resultEventDescriptor) {
        if ([resultEventDescriptor descriptorType] != kAENullEvent) {
            if ([resultEventDescriptor descriptorType] == kTXNUnicodeTextData) {
                result = [resultEventDescriptor stringValue];
            }
        }
    }
    return result;
}

@end
- (NSString *)stringForResultEventDescriptor:(NSAppleEventDescriptor *)resultEventDescriptor
{
    NSString *result = nil;

    if (resultEventDescriptor) {
        if ([resultEventDescriptor descriptorType] != kAENullEvent) {
            if ([resultEventDescriptor descriptorType] == kTXNUnicodeTextData) {
                result = [resultEventDescriptor stringValue];
            }
        }
    }
    return result;
}


This method can be rewritten far more simply:

- (NSString *)stringForResultEventDescriptor:(NSAppleEventDescriptor *)resultEventDescriptor {
    return (resultEventDescriptor.descriptorType == kTXNUnicodeTextData) ? resultEventDescriptor.stringValue : nil;
}




- (void)collect{
    [self runWithEvent];
}


This method seems entirely unnecessary.  Why doesn't the timer just call runWithEvent directly?