2012-01-25 55 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()後顯示。現在,每次我調用此函數時,不是創建對筆尖的引用,而是每次創建一次引用並使用該引用。所以泄漏消失了:)。無論如何,謝謝你的回覆:) –