ठीक है, एक कंपाइलर स्तर पर कई ओवरलैपिंग कारण हैं ... इस बारे में सोचने के लिए सबसे सरल है कि स्थिर चर आपके संकलित अनुप्रयोग के समर्पित डेटा अनुभाग में संग्रहीत हैं, जो कि स्मृति के रूप में बस मैप किया गया है। इसलिए संकलक को सटीक रूप से पता होना चाहिए कि संकलन समय पर क्या है। किसी ऑब्जेक्टिव-सी विधि कॉल का नतीजा परिभाषा और अभ्यास में संकलन समय पर अप्रत्याशित है - आप कभी भी यह सुनिश्चित करने के लिए नहीं जानते कि उस विधि कॉल के व्यवहार को बदलने के लिए रनटाइम पर कुछ "रोचक" नहीं होगा, इसलिए आप नहीं निश्चित रूप से पता चलेगा कि क्या वापस किया जाएगा।
यह सब कुछ अलग है उदा। सी ++, विभिन्न कारणों से (एक महत्वपूर्ण व्यक्ति है कि सी ++ में रचनाकार हैं, जबकि उद्देश्य-सी नहीं है)।
- निर्माता आदेश अप्रत्याशित है, लेकिन यह कंस्ट्रक्टर्स एक दूसरे पर निर्भर है करने के लिए आसान और आम है, अपने कार्यक्रम अर्थ कार्यावधि में अपरिभाषित व्यवहार हो सकता है (डेटा भ्रष्टाचार या जिनमें शामिल हैं: लेकिन फिर भी C++ यह अभी भी कई कारणों से पर सिकोड़ी है दुर्घटनाग्रस्त)।
- गैर-तुच्छ वस्तुओं की शुरूआत बहुत महंगा हो सकती है। लॉन्च समय पर यह सब एक साथ करना कुशल हो सकता है, लेकिन यह आपके ऐप को लॉन्च करने में धीमा कर देता है, जो कि इससे भी बदतर है।
उत्तरार्द्ध बिंदु उद्देश्य-सी के लिए समान रूप से लागू होता है। जितना अधिक आप लॉन्च टाइम पर काम करने से बच सकते हैं, और इसके बजाय मांग में, समय-समय पर, बेहतर उपयोगकर्ता अनुभव बेहतर होता है।
[ध्यान दें कि "कोई स्थैतिक ऑब्जेक्ट इंस्टेंस" नियम के लिए एक उल्लेखनीय अपवाद नहीं है, और यह @ "foo" फ़ॉर्म का तार है। वे वास्तव में आपके ऐप के डेटा सेक्शन में वास्तविक उदाहरण (एक विशेष एनएसएसटींग सबक्लास) के रूप में एन्कोड किए जाते हैं जो कि लॉन्च और मैजिकल रूप से काम करते हैं। लेकिन यह बहुत सावधानीपूर्वक आर्किटेक्टेड है और संकलक & रनटाइम उस पहलू पर कसकर जोड़ दिया जाता है, यह सुनिश्चित करने के लिए कि यह सब आसानी से काम करता है। यह आम तौर पर लागू नहीं होता है और लागू नहीं कर सकता है। ]
स्रोत
2012-11-29 06:04:00
http://stackoverflow.com/a/12304815/1861302 – melanye
पूर्व का लाभ यह है कि यह काम करता है, बाद वाला संकलन भी संकलित नहीं करता है। – rmaddy