2012-05-21 18 views
8

से पहले ऑब्जेक्ट्स को नष्ट कर रहा है प्रतीत होता है मैं डेल्फी XE2 का उपयोग करके गुगलडॉक्स एपीआई के लिए डेल्फी रैपर पर काम कर रहा हूं। मैंने एक्सएमएल डेटा बाइंडिंग विज़ार्ड का उपयोग करके सभी कक्षाएं उत्पन्न कीं। कोड का उपयोग करके व्याख्या करना बहुत आसान है, इसलिए यहां मेरा टेस्ट कॉल फ़ंक्शन है।डेल्फी

function TGoogleDocsApi.GetEntries : IXMLEntryTypeList; 
var 
    httpHelper : IHttpHelper; 
    xml, url : string; 
    xmlDoc : TXmlDocument; 
    ss : TStringStream; 
    feed : IXmlFeedType; 
begin 
    ss := TStringStream.Create; 
    httpHelper := THttpHelper.Create; 
    if(fToken.IsExpired) then 
    fToken.Refresh(fClientId,fClientSecret); 
    url := BaseUrl + 'feeds/default/private/full?showfolders=true&access_token='+fToken.AccessToken+'&v=3'; 
    xml := httpHelper.GetResponse(url); 
    ss.WriteString(xml); 
    ss.Position := 0; 
    xmlDoc := TXmlDocument.Create(nil); 
    xmlDoc.LoadFromStream(ss); 
    feed := GoogleData2.Getfeed(xmlDoc); 
    Result := feed.Entry; 
end; 

अब, मुद्दा यह है कि 'अंत' मारा जाता है पर, Result.ChildNodes स्मृति में एक पता है और यह गिनती 20 IXMLEntryTypeList IXMLNodeCollection का एक बच्चा इंटरफेस है है। अगर बयान, मैं "। मॉड्यूल में पता 0061A55C 'GoogleDocsApiTests.exe' पढ़ें पता 00,000,049 के कम से पहुँच उल्लंघन" और जब यह बताने वाला पहुँच उल्लंघन मिल

procedure TestIGoogleDocsApi.TestGetEntries; 
var 
    ReturnValue: IXMLEntryTypeList; 
begin 
    ReturnValue := FIGoogleDocsApi.GetEntries; 
    if(ReturnValue = nil) then 
    fail('Return value cannot be nil'); 
    if(ReturnValue.ChildNodes.Count = 0) then 
    fail('ChildNodes count cannot be 0'); 
end; 

दूसरे पर:

अब यहाँ

अपने परीक्षण है मैं रिटर्नवैल्यू और रिटर्नवैल्यू के लिए अपनी घड़ियों को देखता हूं। चिल्डनोड्स, मुझे लगता है कि रिटर्नवैल्यू के पास एक ही पता है क्योंकि परिणाम TGoogleDocsApi.GetEntries विधि में किया गया था, लेकिन यह मुझे रिटर्नवैल्यू के लिए घड़ी पर पहुंच उल्लंघन देता है। चिल्डनोड्स और TGoogleDocsApi.GetEntires में विधि, परिणाम .ChildNodes का एक वैध पता है और इसकी गुण भर चुके हैं।

मेरे लिए ऐसा लगता है कि डेल्फी लाइन के साथ कहीं भी चाइल्ड नोड्स संपत्ति जारी कर रहा है, लेकिन यह मुझे समझ में नहीं आता है क्योंकि रिटर्नवैल्यू को अभी भी इसका संदर्भ देना चाहिए (मुझे लगता है) इसे चारों ओर रखना चाहिए।

कोई विचार क्या हो रहा है?

+5

आपका फ़ंक्शन 'ss' लीक करता है, लेकिन शायद आपने इस प्रश्न के लिए कोड को सरल बना दिया है। साथ ही, फ़ंक्शन लौटने पर 'फ़ीड' को जीवित रखने के लिए क्या होता है। क्या 'feed.Entry' का संदर्भ लिया गया है' फ़ीड 'जीवित रखें? जवाब इन पंक्तियों के साथ होगा, यानी @hvd क्या कहता है की नस में। आपको आवश्यक वस्तुएं जीवित रखना है। –

उत्तर

21

nil के Owner के साथ आप TXMLDocument.Create पर कॉल कर रहे हैं। इसका मतलब है कि इसका जीवनकाल अंतरफलक संदर्भ गिनती के माध्यम से नियंत्रित होता है। काम करने के लिए, आप वास्तव में इंटरफेस का उपयोग करने के लिए की आवश्यकता है। संदर्भ बनाए रखने के लिए xmlDoc का प्रकार IXMLDocument पर बदलें, या फिर वीसीएल के लिए आंतरिक कुछ ऐसा होगा जब आप इसकी अपेक्षा नहीं कर रहे हों।

+5

फ़ंक्शन में पास करने से पहले स्थानीय संदर्भ को रखने से फ़ंक्शन कॉल में कॉन्स्ट पैरामीटर का उपयोग करते समय आपको समय से पहले भी बचाया जाएगा: http://qc.embarcadero.com/wc/qcmain.aspx?d=90482 –

+4

+1, @nick, आप ['IXMLDocument'] को तुरंत चालू करने के लिए [' LoadXMLData'] (http://docwiki.embarcadero.com/Libraries/en/Xml.XMLDoc.LoadXMLData) का उपयोग कर सकते हैं (http://docwiki.embarcadero.com/ पुस्तकालय/en/Xml.XMLIntf.IXMLDocument)। – TLama