2009-02-17 15 views
5

निम्नलिखित ObjC कोड उदाहरण पर विचार करें:क्या उद्देश्य-सी में विधि पैरामीटर को बनाए रखने/रिलीज़ करना एक अच्छा विचार है?

- (void)doStuffWithString:(NSString *)someParam { 
    // Do stuff with someParam 
}

इस कोड को एक मल्टी-थ्रेडेड अनुप्रयोग में निष्पादित किया जा रहा थे, तो यह एक अच्छा विचार को बनाए रखने/रिलीज someParam को हो सकता है? विशेष रूप से, मैं उन परिदृश्यों के बारे में सोच रहा हूं जिनमें पास-इन पैरामीटर कई थ्रेड द्वारा साझा किया गया सिंगलटन ऑब्जेक्ट है। क्या निम्नलिखित सुरक्षित है, उदाहरण के लिए?

- (void)doStuffWithString:(NSString *)someParam { 
    [stringParam retain]; 
    // Do stuff with someParam 
    [stringParam release]; 
}

उत्तर

11

नहीं, यह पैरामीटर के लिए थ्रेड-सुरक्षा प्रदान करने और प्रदान करने के लिए व्यक्तिगत कार्यों का काम नहीं है।

कहीं भी स्टैक कुछ उस वस्तु को पारित करता है जो "doStuffWithString" के पैरामीटर है। यह वह कोड है जो उस ऑब्जेक्ट को गारंटी देना चाहिए कि फ़ंक्शन कॉल की लंबाई के माध्यम से वैध रहेगा।

विचार करने के लिए दो चीजें;

  1. ऐसी स्थितियों में जहां आप किसी तृतीय-पक्ष या लाइब्रेरी फ़ंक्शन को कॉल करते हैं, ये आपके लिए एक रिटेन/रिलीज़ नहीं करेंगे।
  2. यदि परम को हटाए जाने का खतरा है तो यह आपके कॉल को 'बनाए रखने' से पहले भी हो सकता है!

This thread भी सहायक हो सकता है।

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