ScriptingBridge:这些泄漏是我的还是脚本编写桥?

时间:2012-12-18 01:31:49

标签: cocoa

我将我的应用程序从使用垃圾收集转换为ARC。该应用程序使用ScriptingBridge框架。出于好奇,我用仪器" Leaks"模板和泄漏。 AEDescImpl对象不是由我的代码直接创建的,这些对象似乎是由Scripting Bridge创建的。我是对的吗?

如果这些泄漏来自ScriptingBridge,这是正常的,我只需要忍受它吗?

感谢。

这是一个仪器图像,显示"周期&根与#34; - > "泄漏周期":

image

我输入相关部分。
_NSCFArray
    

    +40 ( no ivar ]: AEDescImpl  
    
      +56 [ no ivar ]: AEDescImpl  
    
      +64 [ no ivar ]: AEDescImpl  
    
      +72 [ no ivar ]: AEDescImpl  
    
      +80 [ no ivar ]: AEDescImpl  
    
      +88 [ no ivar ]: AEDescImpl  
    
      +96 [ no ivar ]: AEDescImpl  


彼得关于将findOpenTuner方法全部纳入其中的评论促使我创建了一个" mini"项目。有问题的方法很大,并且有很多方法调用,所以我将方法简化为其本质。我添加了一个for循环来调用该方法24次,因为它运行如此之快,仪器没有任何机会看到任何东西。

出于好奇,我在EyeTVPlayer_window上注释了for循环并在其上运行了Instruments,发现没有泄漏或循环。如下所示,如果没有注释这个for循环,则存在泄漏。在我看来,我的编码不正确或者Scripting Bridge正在泄漏。

" mini"项目的实施文件。

#import "AppDelegate.h"
#import "EyeTV.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSUInteger i;
    for (i=0; i<25; i++) {
        NSLog(@"before i=%li", i);
        [self findOpenTuner];
        NSLog(@"after i=%li", i);
    }
}

- (void)findOpenTuner;
{
    EyeTVApplication *eyeTVApp;

    eyeTVApp = [SBApplication applicationWithBundleIdentifier:@"com.elgato.eyetv"]; // 08-04-2011 needed to do mute below in method call filterPlayVolumeMute

    SBElementArray *eyeWindows = [eyeTVApp player_windows]; // are EyeTVWindow

    BOOL openTunerFound = FALSE;    // 07-21-2010
    int j=0;
    for (EyeTVPlayer_window *eyeWin in eyeWindows)  // 12-07-2012 #1
    {
        if ([[eyeWin programInfo] count] == 0) {
        } else {
            // this is the tuner we want
            openTunerFound = FALSE; // 07-21-2010
            [eyeWin select];    // 07-21-2010 // moves "focus" to window, places it at index 0
            break;              // 07-21-2010 // got the tuner, leave loop
        }
        j++;
    }
}

@end

&#34; mini&#34;的屏幕截图项目

enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

ScriptingBridge也存在同样的问题。我最后用自动释放池附上了负责的代码。

@autoreleasepool {
  // Leaking code
}

这消除了最大的泄漏,现在它只在我的应用程序上泄漏了几个字节。