ऑब्जेक्टिव-सी: एक विधि में फिक्सिंग स्मृति प्रबंधन

वोट
5

मैं लगभग वहाँ ऑब्जेक्टिव-सी में सरल संदर्भ गिनती / स्मृति प्रबंधन को समझने रहा हूँ, लेकिन मैं निम्नलिखित कोड के साथ एक कठिन समय हो रही है। मैं mutableDict को रिहा कर रहा हूँ (नीचे दिए गए कोड में टिप्पणी की) है और यह मेरी कोड में हानिकारक व्यवहार के कारण है। अगर मैं स्मृति रिसाव जाने, यह उम्मीद के रूप में काम करता है, लेकिन यह है कि स्पष्ट रूप से इस सवाल का जवाब यहाँ नहीं है। ;-) आप में से किसी अधिक अनुभवी लोगों को कैसे मैं इस विधि बेहतर मेरी स्मृति पदचिह्न को संभालने के लिए में से किसी को फिर से लिख सकते हैं के रूप में सही दिशा में मुझे बात करने के लिए तरह पर्याप्त होगा? मुख्य रूप से मैं कैसे प्रबंध कर रहा हूँ NSMutableDictionary * mutableDict, के रूप में है कि बड़ा अपराधी यहाँ है के साथ। मैं इस समस्या को समझने के लिए चाहते हैं, और न सिर्फ नकल / पेस्ट कोड - तो कुछ टिप्पणियाँ / प्रतिक्रिया आदर्श है। सबको शुक्रीया।

- (NSArray *)createArrayWithDictionaries:(NSString *)xmlDocument 
                               withXPath:(NSString *)XPathStr {

    NSError *theError = nil;
    NSMutableArray *mutableArray = [[[NSMutableArray alloc] init] autorelease];
    //NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] init];
    CXMLDocument *theXMLDocument = [[[CXMLDocument alloc] initWithXMLString:xmlDocument options:0 error:&theError] retain]; 
    NSArray *nodes = [theXMLDocument nodesForXPath:XPathStr error:&theError];
    int i, j, cnt = [nodes count];
    for(i=0; i < cnt; i++) {
        CXMLElement *xmlElement = [nodes objectAtIndex:i];
        if(nil != xmlElement) {
            NSArray *attributes = [NSArray array];
            attributes = [xmlElement attributes];
            int attrCnt = [attributes count];
            NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc] init];
            for(j = 0; j < attrCnt; j++) {
                if([[[attributes objectAtIndex:j] name] isKindOfClass:[NSString class]]) 
                    [mutableDict setValue:[[attributes objectAtIndex:j] stringValue] forKey:[[attributes objectAtIndex:j] name]];
                else 
                    continue;
            }
            if(nil != mutableDict) {
                [mutableArray addObject:mutableDict];
            }
            [mutableDict release];  // This is causing bad things to happen.
        }
    }

    return (NSArray *)mutableArray;
}
26/02/2009 को 23:32
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
5

यहाँ अपने कोड के किसी समान पुनर्लेखन है:

- (NSArray *)attributeDictionaries:(NSString *)xmlDocument withXPath:(NSString *)XPathStr {
    NSError *theError = nil;
    NSMutableArray *dictionaries = [NSMutableArray array];
    CXMLDocument *theXMLDocument = [[CXMLDocument alloc] initWithXMLString:xmlDocument options:0 error:&theError]; 
    NSArray *nodes = [theXMLDocument nodesForXPath:XPathStr error:&theError];

    for (CXMLElement *xmlElement in nodes) {
        NSArray *attributes = [xmlElement attributes];
        NSMutableDictionary *attributeDictionary = [NSMutableDictionary dictionary];
        for (CXMLNode *attribute in attributes) {
            [attributeDictionary setObject:[attribute stringValue] forKey:[attribute name]];
        }

        [dictionaries addObject:attributeDictionary];
    }

    [theXMLDocument release];
    return attributeDictionaries;
}

सूचना मैं केवल पर भरोसा संदर्भ किया theXMLDocument। ऐसा इसलिए है क्योंकि सरणियों और शब्दकोशों इस विधि के दायरे से बाहर रहते हैं। arrayऔर dictionaryवर्ग के तरीकों में से autoreleased उदाहरण बना NSArrayऔर NSMutableDictionaryवस्तुओं। फोन करने वाले उन्हें स्पष्ट रूप से बनाए रखने के लिए नहीं है, तो वे अपने आप अनुप्रयोग की घटना पाश के अगले जाने के दौर को जारी किया जाएगा।

  • मैं भी कोड है कि कभी नहीं निष्पादित करने के लिए जा रहा था हटा दिया। CXMLNode nameविधि यह एक स्ट्रिंग रिटर्न का कहना है, ताकि परीक्षण हमेशा सच हो जाएगा।
  • अगर mutableDictहै nil, तो आप बड़ी समस्याओं की है। यह बेहतर है कि यह चुपचाप असफल से एक अपवाद फेंकता है, तो मुझे लगता है कि परीक्षण के साथ भाग भी किया था।
  • मैं भी अपेक्षाकृत नया प्रयोग किया जाता forगणन वाक्य रचना है, जो अपने काउंटर चर के साथ दूर करता है।
  • मैं थोड़ा और अधिक कोको-ish होने के लिए कुछ चर और विधि नाम दिया। कोको अधिकांश भाषाओं में है कि यह आम तौर पर "बनाने" जब तक आप विशेष रूप से जारी है जो कुछ भी वस्तु आप वापसी के लिए फोन करने वाले जिम्मेदार बनाना चाहते की तरह एक क्रिया का उपयोग करने के गलत माना जाता है से अलग है।
  • आप के साथ कुछ भी नहीं किया theError। आप या तो इसे की जाँच करनी चाहिए और त्रुटि की रिपोर्ट, वरना में पारित nilअगर आप इसे जांच करने के लिए नहीं जा रहे हैं। वहाँ एप्लिकेशन का उपयोग करना नहीं जा रहे हैं एक त्रुटि वस्तु का निर्माण करने में कोई मतलब नहीं है।

मुझे आशा है कि यह मदद करता है आप सही दिशा में इशारा मिलता है।

27/02/2009 को 00:18
का स्रोत उपयोगकर्ता

वोट
1

ठीक है, को रिहा mutableDict वास्तव में कोई समस्या नहीं पैदा कर रहा जाना चाहिए क्योंकि यह ऊपर लाइन (mutableArray को mutableDict जोड़ने) यह स्वतः ही बनी रहेगी। जबकि मुझे यकीन है कि वास्तव में क्या आपके कोड के साथ गलत जा रहा है नहीं कर रहा हूँ (आपके द्वारा निर्दिष्ट नहीं किया क्या "बुरी बातों" का अर्थ है), वहाँ कुछ सामान्य बातें मेरा सुझाव है:

  1. mutableArray अभी autorelease न करें। यह एक नियमित रूप से alloc / init बयान हो और यह autorelease जब आप इसे वापस ( "वापसी [mutableArray autorelease];")।

  2. theXMLDocument लीक कर रहा है, कि जारी करने के लिए लौटने से पहले सुनिश्चित करें। इसके अलावा, आप यह बनाए रखने के लिए की तरह आप कर रहे हैं की जरूरत नहीं है। alloc / init वस्तु 1 में गिनती बनाए रखने शुरू करने, इसे फिर से बनाए रखना सिर्फ यह हमेशा के लिए लीक सुनिश्चित करता है के द्वारा काम करता है। को बनाए रखने और लौटने से पहले इसे जारी है और यह लीक नहीं होगा से छुटकारा।

  3. बस एक टिप: यह सुनिश्चित करें कि आप इस विधि का वापसी मान जब इसे कहीं और का उपयोग कर बनाए रखने हो - के रूप में और जब आवश्यकता होती जब तक आप स्पष्ट बनाए रखने / इसे कहीं रिलीज के आसपास होने की गारंटी नहीं है परिणाम autoreleased किया गया है।

अन्यथा, इस कोड को चाहिए काम करते हैं। यह अभी भी नहीं है, तो एक दूसरी बात मैं कोशिश करेगा शायद कर रहा है [mutableArray addObject: [mutableDict कॉपी]] यह सुनिश्चित करें कि mutableDict जब यह जारी है आप कोई समस्या नहीं होती है।

26/02/2009 को 23:49
का स्रोत उपयोगकर्ता

वोट
0

में मेमोरी मैनेजमेंट प्रोग्रामिंग गाइड विषय के अंतर्गत तरीके से वस्तुओं रिटर्निंग (थोड़ा नीचे स्क्रॉल करें), वहाँ कैसे सही स्मृति प्रबंधन के साथ एक विधि से वस्तुओं वापस जाने के लिए पर कुछ सरल उदाहरण हैं।

08/09/2010 को 22:48
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more