我将我的应用程序从使用垃圾收集转换为 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
“迷你”项目的仪器截图。