2009-06-14 13 views
69

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

धन्यवाद

उत्तर

121

+initialize विधि पहली बार एक वर्ग प्रयोग किया जाता है स्वचालित रूप से कहा जाता है, किसी भी वर्ग तरीकों का इस्तेमाल किया जाता है या उदाहरणों से पहले बनाई गई हैं। आपको कभी भी +initialize पर कॉल नहीं करना चाहिए।

मैं भी एक tidbit मुझे पता चला है कि आप नीचे सड़क काट सकते हैं साथ दी जाने वाली चाहता था: +initialize उपवर्गों द्वारा विरासत में मिली है और साथ ही प्रत्येक उपवर्ग है कि उनके अपने के +initialize को लागू नहीं करता है के लिए कहा जाता है। यदि आप +initialize में सिंगलटन प्रारंभिक रूप से लागू करते हैं तो यह विशेष रूप से समस्याग्रस्त हो सकता है। समाधान तो जैसे वर्ग चर के प्रकार की जाँच करने के लिए है:

+ (void) initialize { 
    if (self == [MyParentClass class]) { 
    // Once-only initializion 
    } 
    // Initialization for this class and any subclasses 
} 

सभी वर्गों कि NSObject से उतर दोनों +class और -class तरीकों कि वापसी Class वस्तु है। चूंकि प्रत्येक वर्ग के लिए केवल एक वर्ग वस्तु है, इसलिए हम == ऑपरेटर के साथ समानता का परीक्षण करना चाहते हैं। आप इसका उपयोग फ़िल्टर करने के लिए कर सकते हैं कि केवल एक बार कभी क्या होना चाहिए, एक वर्ग के नीचे एक पदानुक्रम में प्रत्येक विशिष्ट वर्ग के लिए एक बार बनाम (जो अभी तक मौजूद नहीं हो सकता है)।

एक स्पर्शरेखा विषय पर, यह निम्न संबंधित तरीकों के बारे में सीखने लायक अगर आपने पहले नहीं किया गया है:

  • - isKindOfClass:(Class)aClass (सच aClass और बच्चों के लिए) (केवल aClass खुद के लिए सही)

    संपादित करें: https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html

    : http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/

    इसके अलावा, माइक ऐश +initialize और +load तरीकों के बारे में एक अच्छा विस्तृत शुक्रवार क्यू & एक ने लिखा है: @bbum बताते हैं कि अधिक +initialize के बारे में इस पोस्ट बाहर चेक

  • +5

    "अगर ([स्वयं वर्ग] == [माईपैर क्लास क्लास])" '[स्वयं वर्ग] 'यहां अनावश्यक है। आप बस कह सकते हैं 'अगर (self == [MyParentClass क्लास]) ' – user102008

    +1

    धन्यवाद! आपकी बोली ने मेरे प्रश्न का उत्तर दिया कि क्यों एक विशेष स्थिर प्रारंभकर्ता को दो बार बुलाया जा रहा था। –

    51

    वहाँ +initialize वर्ग विधि है कि इससे पहले कि एक वर्ग प्रयोग किया जाता है के नाम से जाना जाएगा।

    +0

    धन्यवाद, कि वास्तव में है मैं क्या देख रहा था, लेकिन मैं खोज किया "स्थिर init", "स्थिर प्रारंभकर्ता", आदि और यह भी नहीं मिला। –

    +8

    लगभग हर मामले में, जहां जावा में आप "स्थैतिक" कहेंगे, आप उद्देश्य-सी में "कक्षा" कहते हैं। – Chuck

    10

    इस विषय में एक परिशिष्ट का थोड़ा सा:

    'स्थिर रचनाकार' बनाने का एक और तरीका है I n Obj सी, एक __attribute निर्देशों का उपयोग:

    // prototype 
    void myStaticInitMethod(void); 
    
    __attribute__((constructor)) 
    void myStaticInitMethod() 
    { 
        // code here will be called as soon as the binary is loaded into memory 
        // before any other code has a chance to call +initialize. 
        // useful for a situation where you have a struct that must be 
        // initialized before any calls are made to the class, 
        // as they would be used as parameters to the constructors. 
        // e.g. 
        myStructDef.myVariable1 = "some C string"; 
        myStructDef.myFlag1 = TRUE; 
    
        // so when the user calls the code [MyClass createClassFromStruct:myStructDef], 
        // myStructDef is not junk values. 
    } 
    
    +2

    + लोड वही काम करेगा और उद्देश्य-सी पैराडाइम –

    +0

    @Grady Nope के साथ सिंक में और अधिक दिखता है, मैं विशेष रूप से उस पोस्ट में एक स्थिति सूचीबद्ध करता हूं जहां + लोड बराबर नहीं है। –

    +0

    + प्रारंभ करना अलग होगा, लेकिन + लोड होना चाहिए, क्या यह नहीं होना चाहिए? –