2012-01-25 26 views
0

我在识别内存泄漏时遇到问题。我试过Instruments,它说每次我调用下面描述的函数时都会有内存泄漏。无法获取功能中内存泄漏的位置

CFStringRef getStringFromLocalizedNIB(int cmdId) 
{ 
    IBNibRef  nibRef; 
    WindowRef  wind=NULL; 
    CFStringRef  alertString; 

    CreateNibReference(CFSTR("main"), &nibRef); 
    CreateWindowFromNib(nibRef, CFSTR("Localized Strings"), &wind); 
    DisposeNibReference(nibRef); 

    ControlID alertID = {'strn',cmdId}; 
    ControlRef alertRef; 
    GetControlByID(wind, &alertID,&alertRef); 
    GetControlData(alertRef, kControlNoPart, kControlStaticTextCFStringTag, sizeof(CFStringRef), &alertString, NULL); 
    return alertString; 
} 

每次我调用函数,我释放返回的对象。

CFStringRef lstr; 
lstr = getStringFromLocalizedNIB(20); 
//Use lstr; 
CFRelease(lstr); 

那么任何人都可以解释泄漏的位置吗?

回答

0

如果我理解正确,您不会显示使用CreateWindowFromNib()创建的窗口。我希望这个窗口的碳当量是close-release,而CreateWindowFromNib()是由ShowWindow()来平衡的。虽然我在9年内没有完成碳排放,所以我不确定。

尝试在风调用DisposeWindow()平衡创造:

... 
    DisposeWindow(wind); 
    return alertString; 
} 
+0

感谢@iccir的答复。问题是我的笔尖文件中有2个顶级对象。我还需要释放它们吗?如果是这样,如果我不为其他窗口创建WindowRef,我如何释放它们。 –

+0

在DisposeWindow()调用之后仍然出现泄漏?在Cocoa中,你必须释放所有顶级对象。在这种情况下,我不确定 - 你有一个有效的观点,因为你没有创造其他人。 – iccir

+0

是的,泄漏仍在DisposeWindow()后显示。现在,每次我调用此函数时,不是创建对笔尖的引用,而是每次创建一次引用并使用该引用。所以泄漏消失了:)。无论如何,谢谢你的回复:) –