我将我的应用程序从使用垃圾收集转换为ARC。该应用程序使用ScriptingBridge框架。出于好奇,我用仪器" Leaks"模板和泄漏。 AEDescImpl对象不是由我的代码直接创建的,这些对象似乎是由Scripting Bridge创建的。我是对的吗?
如果这些泄漏来自ScriptingBridge,这是正常的,我只需要忍受它吗?
感谢。
这是一个仪器图像,显示"周期&根与#34; - > "泄漏周期":
我输入相关部分。
_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;的屏幕截图项目
答案 0 :(得分:0)
ScriptingBridge也存在同样的问题。我最后用自动释放池附上了负责的代码。
@autoreleasepool {
// Leaking code
}
这消除了最大的泄漏,现在它只在我的应用程序上泄漏了几个字节。