2009-03-02 12 views
13

में एक NSString जारी करने के लिए मैं विधिजब iPhone

-(NSMutableArray *) getPaises { 
    NSMutableArray * paises; 
    paises = [[NSMutableArray alloc] init]; 
    while(get new row) { 
     NSString *aPais = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
     [paises addObject:aPais]; 
    } 
    return paises; 
    } 

मैं aPais को रिहा नहीं कर रहा हूँ निम्नलिखित है, क्योंकि अगर मैं इसे अनुप्रयोग क्रैश हो जाता है। मुझे नहीं पता कि कब या अगर इसे इसे इस्तेमाल करने के बाद कहीं इसे छोड़ देना चाहिए और यदि ऐसा है, तो मैं इसे कैसे कर सकता हूं। बस एनएसएमयूटेबलएरे जारी करें पर्याप्त है? या क्या मुझे इसे पार करना होगा और प्रत्येक वस्तु को छोड़ना होगा?

और यदि मुझे इसे रिलीज़ करने की आवश्यकता नहीं है, तो रिलीज़ करने के लिए कौन जिम्मेदार है?

+0

विधि नामकरण के संबंध में एक नोट: कोको में, "getFoo" नामक एक विधि संदर्भ द्वारा foo लौटाती है: - (शून्य) getFoo: (बाहर NSMutableArray **) outArray। कोको नामकरण सम्मेलनों के साथ संगत होने के लिए, आपको अपनी विधि का नाम केवल "paises" करना चाहिए। –

उत्तर

16

जैसा कि एपटेल ने कहा था, आपको उस विशेष स्ट्रिंग को रिलीज़ करने की आवश्यकता नहीं है। आप और अधिक सक्रिय होना चाहते थे, तो आप इस बजाय कर सकता है:

-(NSMutableArray *) getPaises { 
    NSMutableArray * paises; 
    paises = [[[NSMutableArray alloc] init] autorelease]; 
    while(get new row) { 
     NSString *aPais = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)]; 
     [paises addObject:aPais]; 
     [aPais release]; 
    } 
    return paises; 
} 

सारांश में:

  • [[NSString alloc] initWith ...] -> आप जारी या autorelease चाहिए।

  • [एनएसएसटींग स्ट्रिंग के साथ ...] -> रिलीज़ करने की कोई आवश्यकता नहीं है।

- संपादित करें: Países के लिए autorelease जोड़ा गया, के रूप में आप यह लौट रहे हैं। जब आप किसी ऑब्जेक्ट को वापस करते हैं, तो हमेशा इसे ऑटोरेलीज़ करें यदि आपके पास & आवंटित है।

+0

बहुत बहुत धन्यवाद। मैं मैन्युअल रूप से एनएसएमयूटेबलएरे जारी कर रहा हूं, लेकिन ऑटोरेलीज एक बेहतर विकल्प है। इसे बदलना होगा। – madelman

5

stringWithUTF8String: एक ऑटोरेलीज़ स्ट्रिंग देता है जो अगले ईवेंट में कोको द्वारा स्वचालित रूप से रिलीज़ हो जाएगा। लेकिन जब आप addObject: करते हैं तो स्ट्रिंग को सरणी में भी रखा जाता है ... इसलिए जब तक यह सरणी में है, तब तक इसे बनाए रखा जाएगा।