1

我将我的应用程序从使用垃圾收集转换为 ARC。该应用程序使用 ScriptingBridge 框架。出于好奇,我使用 Instruments “Leaks” 模板运行它并且有泄漏。AEDescImpl 对象不是由我的代码直接创建的,它们似乎是由 Scripting Bridge 创建的。我对吗?

如果这些泄漏来自 ScriptingBridge,这是否正常,我只能忍受它?

谢谢。

这是显示“循环和根”->“泄漏循环”的仪器图像:

图片

我在相关部分输入。
_NSCFArray

    +40 ( 没有 ivar ]: AEDescImpl  
      +56 [无 ivar]:AEDescImpl  
      +64 [无 ivar]:AEDescImpl  
      +72 [无 ivar]:AEDescImpl  
      +80 [无 ivar]:AEDescImpl  
      +88 [无 ivar]:AEDescImpl  
      +96 [无 ivar]:AEDescImpl  


Peter 关于将 findOpenTuner 方法完整包含在内的评论促使我创建了一个“迷你”项目。有问题的方法很大并且有很多方法调用,所以我将方法简化为本质。我添加了一个 for 循环来调用该方法 24 次,因为它运行得如此之快,仪器没有任何机会看到任何东西。

出于好奇,我在 EyeTVPlayer_window 上注释掉了 for 循环,并在上面运行了 Instruments,没有发现任何泄漏或循环。如下所示,如果未注释此 for 循环,则存在泄漏。在我看来,要么我的编码不正确,要么 Scripting Bridge 泄漏。

“迷你”项目的实施文件。

#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

“迷你”项目的仪器截图。

在此处输入图像描述 在此处输入图像描述

4

1 回答 1

0

ScriptingBridge 也有同样的问题。我最终用自动释放池封装了负责的代码。

@autoreleasepool {
  // Leaking code
}

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

于 2013-09-10T14:48:27.533 回答