2012-11-28 12 views
5

क्या इस का उपयोग करने का लाभ यह है करने के लिए एक शून्य असाइन किया गया है:क्यों सिंगलटन के स्थिर चर

+ (CardPainter*) sharedPainter { 
    static CardPainter* sp = nil; 

    if (nil == sp) { 
     sp = [[CardPainter alloc] init]; 
    } 

    return sp; 
} 
बजाय इस बात का

:

+ (CardPainter*) sharedPainter { 
    static CardPainter* sp = [[CardPainter alloc] init]; 

    return sp; 
} 

स्थिर चर प्रारंभ केवल एक बार किया जाता है, तो मैं देख रहा हूँ पूर्व का कोई फायदा नहीं।

+3

http://stackoverflow.com/a/12304815/1861302 – melanye

+5

पूर्व का लाभ यह है कि यह काम करता है, बाद वाला संकलन भी संकलित नहीं करता है। – rmaddy

उत्तर

-2

क्योंकि अगर आप नहीं पूछते हैं, तो आप किसी भी डेटा को खोने पर "साझा पैनटर" कहने पर किसी भी समय "* sp" शुरूआत करेंगे।

तो, यदि आप पूछते हैं कि क्या स्पिल शून्य है और उत्तर गलत है तो "एसपी" पहले ही शुरू हो चुका है और यह उदाहरण वापस कर देता है। यदि उत्तर सत्य है, तो इसका मतलब है कि एसपी प्रारंभ नहीं हुआ है और केवल उस स्थिति में आप init फ़ंक्शन को कॉल करते हैं।

+0

यह नहीं है कि क्या आप जांचते हैं कि क्या पॉइंटर शून्य है, यह क्यों है कि प्रारंभिक रेखा –

+0

पर केवल 'आवंटन इनिट' को कॉल न करें, वास्तव में स्थैतिक की घोषणा साझा नहीं होनी चाहिए, कार्यान्वयन से पहले होना चाहिए । – Vertig0

+0

@PatricioIgnacioFariaValdivi: umm ... क्या? बेशक आप एक फंक्शन – user102008

1

ठीक है, एक कंपाइलर स्तर पर कई ओवरलैपिंग कारण हैं ... इस बारे में सोचने के लिए सबसे सरल है कि स्थिर चर आपके संकलित अनुप्रयोग के समर्पित डेटा अनुभाग में संग्रहीत हैं, जो कि स्मृति के रूप में बस मैप किया गया है। इसलिए संकलक को सटीक रूप से पता होना चाहिए कि संकलन समय पर क्या है। किसी ऑब्जेक्टिव-सी विधि कॉल का नतीजा परिभाषा और अभ्यास में संकलन समय पर अप्रत्याशित है - आप कभी भी यह सुनिश्चित करने के लिए नहीं जानते कि उस विधि कॉल के व्यवहार को बदलने के लिए रनटाइम पर कुछ "रोचक" नहीं होगा, इसलिए आप नहीं निश्चित रूप से पता चलेगा कि क्या वापस किया जाएगा।

यह सब कुछ अलग है उदा। सी ++, विभिन्न कारणों से (एक महत्वपूर्ण व्यक्ति है कि सी ++ में रचनाकार हैं, जबकि उद्देश्य-सी नहीं है)।

  1. निर्माता आदेश अप्रत्याशित है, लेकिन यह कंस्ट्रक्टर्स एक दूसरे पर निर्भर है करने के लिए आसान और आम है, अपने कार्यक्रम अर्थ कार्यावधि में अपरिभाषित व्यवहार हो सकता है (डेटा भ्रष्टाचार या जिनमें शामिल हैं: लेकिन फिर भी C++ यह अभी भी कई कारणों से पर सिकोड़ी है दुर्घटनाग्रस्त)।
  2. गैर-तुच्छ वस्तुओं की शुरूआत बहुत महंगा हो सकती है। लॉन्च समय पर यह सब एक साथ करना कुशल हो सकता है, लेकिन यह आपके ऐप को लॉन्च करने में धीमा कर देता है, जो कि इससे भी बदतर है।

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

[ध्यान दें कि "कोई स्थैतिक ऑब्जेक्ट इंस्टेंस" नियम के लिए एक उल्लेखनीय अपवाद नहीं है, और यह @ "foo" फ़ॉर्म का तार है। वे वास्तव में आपके ऐप के डेटा सेक्शन में वास्तविक उदाहरण (एक विशेष एनएसएसटींग सबक्लास) के रूप में एन्कोड किए जाते हैं जो कि लॉन्च और मैजिकल रूप से काम करते हैं। लेकिन यह बहुत सावधानीपूर्वक आर्किटेक्टेड है और संकलक & रनटाइम उस पहलू पर कसकर जोड़ दिया जाता है, यह सुनिश्चित करने के लिए कि यह सब आसानी से काम करता है। यह आम तौर पर लागू नहीं होता है और लागू नहीं कर सकता है। ]