2012-01-25 9 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()を使用して作成されたウィンドウは表示されません。私はウィンドウにRelease on closeのCarbon相当物を持ち、CreateWindowFromNib()はShowWindow()によってバランスをとることを期待しています。私は9年後にCarbonをやっていないので、私は確信していません。

作成バランスを取るために風にDisposeWindow()を呼び出してみてください。

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

おかげで返事を@iccir。問題は、nibファイルに2つの最上位オブジェクトがあることです。私もそれらをリリースする必要がありますか?もしそうなら、私は他のウィンドウのWindowRefを作成していない場合、どうすればそれらを解放できますか? –

+0

DisposeWindow()コールの後にリークがまだ表示されていますか? Cocoaでは、すべての最上位オブジェクトを解放する必要があります。この場合、私は確信が持てません - 他のものを作成していないので、あなたは有効なポイントを持っています。 – iccir

+0

はい、DisposeWindow()の後もリークが表示されていました。今度は、この関数を呼び出すたびにnibへの参照を作成するのではなく、参照を一度しか作成せず、その参照を毎回使用しています。だから漏れは消えている。とにかく、お返事ありがとうございます:) –