2009-03-28 7 views
12

मान लीजिए मैं इस तरह एक समारोह है:उद्देश्य-सी स्मृति प्रबंधन - ऑब्जेक्ट्स लौटने पर सर्वोत्तम प्रथाएं?

- (NSSet *) someFunction { 
    //code... 
    return [[[NSSet alloc] initWithObjets:obj1, obj2, nil] autorelease]; 
} 

जब मैं इस समारोह फोन, मैं बनाए रखने के लिए क्या करना होगा/वापसी मान जारी? मुझे लगता है कि मैं करता हूँ।

हालांकि, क्या हुआ अगर मैं autorelease करना नहीं है, इसलिए someFunction अब इस तरह दिखता है:

- (NSSet *) someFunction { 
    //code... 
    return [[NSSet alloc] initWithObjets:obj1, obj2, nil]; 
} 

इस मामले में, मैं यह सोचते हैं रहा हूँ मैं जारी करने के लिए, लेकिन वापसी मान को बनाए रखने की जरूरत नहीं है।

मेरा सवाल है, इस तरह की स्थितियों के लिए सुझाए गए/सर्वोत्तम अभ्यास क्या है? क्या कुछ या किसी अन्य संस्करण का संस्करण अनुशंसित है? धन्यवाद।

उत्तर

12

आपको Memory Management Programming Guide for Cocoa पढ़ने में कुछ समय व्यतीत करना चाहिए।

संक्षेप यह है कि अगर आपको 'एलोक' या 'नया' से शुरू होता है या 'प्रतिलिपि' के साथ शुरू होता है, तो आप संदर्भ के स्वामी हैं और इसे बनाए रखने की आवश्यकता नहीं है। आपने सीधे रिलीज के माध्यम से या ऑटोरेलीज का उपयोग करके अपनी रिलीज के लिए प्रदान किया है।

यदि आपको किसी अन्य तरीके से संदर्भ मिलता है (कक्षा विधि या आपके पास क्या है), तो आपके पास संदर्भ नहीं है, इसलिए आपको रिलीज़ करने की आवश्यकता नहीं है। यदि आप एक संदर्भ रखना चाहते हैं, तो आपको इसे बनाए रखना होगा।

कुल मिलाकर, यह वास्तव में काफी सरल और प्रभावी है।

+0

यह आवंटित है, इसका मतलब यह नहीं है कि इसका मतलब है कि मेरा मानना ​​है कि मेरा मानना ​​है कि – cobbal

+0

हां, आप सही हैं। प्रतिबिंबित करने के लिए मूल प्रतिक्रिया को संपादित करना (वंश की खातिर)। –

+5

मैं प्रोग्रामिंग गाइड का जिक्र करते हुए बहुत सारे पीपीएल देखता हूं। यह पढ़ने के लिए बहुत उबाऊ और सूखा है। –

2

हम्म ...

आम तौर पर, मैं इस "रास्ता" का पालन करें।

+ (id)MyObj { 
    return [[[MyObj alloc] init] autorelease]; 
} 

वस्तु यह वापस लौटाने से पहले जारी वस्तु से पहले ही बुला वस्तु तक पहुँच जाता है पुनः आवंटित की जाती दिया जाएगा। यह एक त्रुटि उत्पन्न करेगा। इसके बजाय एक ऑटोरेलीज पूल का उपयोग करके इस त्रुटि से बचें। मूल रूप से थियोकाकाओ के स्कॉट स्टीवंसन ने मुझे पेश किया। ओबीजे-सी 1.0 के लिए यह उनका और कई पसंदीदा तरीका है।

+0

आम तौर पर विधि नाम के पहले अक्षर के रूप में पूंजी कभी नहीं होनी चाहिए, जब तक यह सामान्य संक्षेप (उदा। HTTPBody, URL) न हो। –

2

दूसरे उदाहरण में कोड करने का एकमात्र कारण यह है कि यदि आपका विधि नाम नए, आवंटित, बनाएं, प्रतिलिपि या उस तरह से कुछ शुरू होता है।

अन्यथा आप आवंटित किसी ऑब्जेक्ट को जारी करने (या ऑटोरेलीज़िंग) के लिए ज़िम्मेदार हैं। पहला उदाहरण अधिकांश चीजों को करने का सही तरीका है।

कॉलिंग फ़ंक्शन को मान को बनाए रखना चाहिए यदि वह चाहता है कि यह कार्यक्षेत्र के दायरे को बरकरार रखे, लेकिन फिर कुछ बिंदुओं पर इसे जारी करने के लिए जिम्मेदार है।

संबंधित मुद्दे