Yay, no more leaks.
[MenuTunes.git] / MenuTunes.m
index ad39b32..a2a1595 100755 (executable)
@@ -15,9 +15,6 @@ Things to do:
     - going to need a different way of defining key combos
 ¥ Optimize, this thing is big and slow :(
 ¥ Apple Events! Apple Events! Apple Events!
-
-¥ I think I found a slight memory leak:
-    425 MenuTunes    7.8%  8:29.87   1    56  4827   215M+ 3.14M   135M-  599M+
 */
 
 #import "MenuTunes.h"
@@ -158,6 +155,7 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
             [menu addItem:[NSMenuItem separatorItem]];
         }
     }
+    
     curTrackIndex = -1; //Force update of everything
     [self timerUpdate]; //Updates dynamic info in the menu
     
@@ -391,13 +389,14 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
     Size length;
     NSString *result;
     Ptr buffer;
+    ComponentInstance myComponent = OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype);
     
     script = [NSString stringWithFormat:@"tell application \"iTunes\"\n%@\nend tell", script];
     
     AECreateDesc(typeChar, [script cString], [script cStringLength], 
 &scriptDesc);
     
-    OSADoScript(OpenDefaultComponent(kOSAComponentType, kAppleScriptSubtype), &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc);
+    OSADoScript(myComponent, &scriptDesc, kOSANullScript, typeChar, kOSAModeCanInteract, &resultDesc);
     
     length = AEGetDescDataSize(&resultDesc);
     buffer = malloc(length);
@@ -405,6 +404,7 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
     AEGetDescData(&resultDesc, buffer, length);
     AEDisposeDesc(&scriptDesc);
     AEDisposeDesc(&resultDesc);
+    CloseComponent(myComponent);
     result = [NSString stringWithCString:buffer length:length];
     if (![result isEqualToString:@""] &&
         ([result characterAtIndex:0] == '\"') &&
@@ -412,7 +412,6 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
     {
         result = [result substringWithRange:NSMakeRange(1, [result length] - 2)];
     }
-    [script release];
     free(buffer);
     buffer = NULL;
     return result;
@@ -422,15 +421,17 @@ target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
 - (void)timerUpdate
 {
     int pid;
+    
     if (GetProcessPID(&iTunesPSN, &pid) == noErr)
     {
         int trackPlayingIndex = [[self runScriptAndReturnResult:@"return index of current track"] intValue];
+        
         if (trackPlayingIndex != curTrackIndex)
         {
             [self updateMenu];
             curTrackIndex = trackPlayingIndex;
         }
-        
+               
         //Update Play/Pause menu item
         if (playPauseMenuItem)
         {