HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

URL-finder using a lot of memory

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
finderlotusingmemoryurl

Problem

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

@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:&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:&psn length:sizeof(ProcessSerialNumber)];

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

// event
NSAppleEventDescriptor *event = [NSAppleEventDescri

Solution

- (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?

Code Snippets

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

    if (resultEventDescriptor) {
        if ([resultEventDescriptor descriptorType] != kAENullEvent) {
            if ([resultEventDescriptor descriptorType] == kTXNUnicodeTextData) {
                result = [resultEventDescriptor stringValue];
            }
        }
    }
    return result;
}
- (NSString *)stringForResultEventDescriptor:(NSAppleEventDescriptor *)resultEventDescriptor {
    return (resultEventDescriptor.descriptorType == kTXNUnicodeTextData) ? resultEventDescriptor.stringValue : nil;
}
- (void)collect{
    [self runWithEvent];
}

Context

StackExchange Code Review Q#80206, answer score: 2

Revisions (0)

No revisions yet.