2009-02-16 19 views
42

मैं निम्नलिखित सेब उदाहरण स्रोत कोड देख रहा हूँ को परिभाषित:उद्देश्य-सी में स्थिर कीवर्ड का उपयोग करते हुए जब एक कैश्ड चर

/* 
Cache the formatter. Normally you would use one of the date formatter styles (such as NSDateFormatterShortStyle), but here we want a specific format that excludes seconds. 
*/ 
static NSDateFormatter *dateFormatter = nil; 
if (dateFormatter == nil) { 
    dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"h:mm a"]; 
} 

यह पता लगाने की कोशिश कर रहा:

  • क्यों स्थिर का उपयोग कीवर्ड?

  • इस संचित चर आप हर बार विधि कहा जाता है शून्य के लिए सेट करता है, तो के बराबर है।

कोड Tableview Suite demo

उत्तर

62

स्टेटिक वेरिएबल फ़ंक्शन में बार-बार कॉल पर उनके असाइन किए गए मान बनाए रखता है। वे मूल रूप से वैश्विक मानों की तरह हैं जो उस कार्य के लिए केवल "दृश्यमान" हैं।

प्रारंभकर्ता कथन केवल एक बार निष्पादित किया जाता है।

यह कोड फ़ंक्शन का उपयोग करने के लिए पहली बार डेटफॉर्मर को शुरू करने के लिए प्रारंभ करता है। फ़ंक्शन में प्रत्येक आगामी कॉल पर दिनांक दिनांक के मूल्य के विरुद्ध चेक किया जाता है। यदि यह सेट नहीं है (जो केवल पहली बार सच होगा) एक नई तारीखफॉर्मेटर बनाया गया है। यदि यह सेट किया गया है तो स्थिर तिथिफॉर्मेटर चर का उपयोग इसके बजाय किया जाएगा।

स्थिर चर से परिचित होने के लायक है। वे बहुत सुविधाजनक हो सकते हैं लेकिन डाउनसाइड्स भी हैं (इस उदाहरण में उदाहरण के लिए डेटफॉर्मर ऑब्जेक्ट को रिलीज़ करना असंभव है)।

बस एक टिप: कभी कभी यह कोड में एक ब्रेकपाइंट जगह है और क्या हो रहा है देखने के लिए देखने के लिए शैक्षिक हो सकता है। जैसे-जैसे आपके कार्यक्रमों की जटिलता बढ़ती है, यह एक अमूल्य कौशल बन जाएगा।

+1

हाय @ एंड्रू अनुदान, बहुत अच्छी व्याख्या, इस मामले में, जैसा कि आपने उल्लेख किया है, इसे जारी करना असंभव है, मान लीजिए कि मैं इसे रिलीज़ करना चाहता हूं और डेट फॉर्मेटर को नया मान असाइन करना चाहता हूं, फिर यह कैसे किया जाना चाहिए। – Ranjit

16

"static" कार्यात्मक का अर्थ है "बराबरी के दाईं ओर सामान का मूल्यांकन नहीं है के माध्यम से हर बार प्रवेश करते हैं, बजाय इसके पिछले मान का उपयोग" में उदाहरण 4 से है इस मामले में। आप, स्मृति की एक पूरी टन का उपयोग कर का जोखिम हो सकता के बाद से इन वस्तुओं है कि दूर जाना कभी नहीं कर रहे हैं:

बड़ी जिम्मेदारी के साथ इस महान शक्ति का प्रयोग करें। NSDateFormatter के साथ इस तरह के मामलों में छोड़कर यह शायद ही कभी उचित है।

+10

मुझे पता है कि यह पुराना सवाल है लेकिन एआरसी के संबंध में इस स्थिर कीवर्ड के प्रभाव पर विचार कर रहा है? – codejunkie

+3

@codejunkie statics ढेर की तुलना में एक अलग स्थान पर संग्रहीत हैं। एआरसी ढेर स्मृति को बनाए रखने और जारी करने की चिंताओं को मानता है ताकि मूल्य ढेर फ्रेम से परे बने रहें। इसलिए, मुझे संदेह है कि एआरसी का स्थैतिक चर पर कोई असर पड़ता है। – smileBot

1

संदर्भ उद्देश्यों के लिए, यह कैसे मैं एक तालिका दृश्य नियंत्रक में उपयोग करने के लिए मेरी तारीख फ़ॉर्मेटर के लिए स्थिर का उपयोग कर रहा है।

+ (NSDateFormatter *) relativeDateFormatter 
{ 
    static NSDateFormatter *dateFormatter; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     //NSLog(@"Created"); 
     dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
     [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
     NSLocale *locale = [NSLocale currentLocale]; 
     [dateFormatter setLocale:locale]; 
     [dateFormatter setDoesRelativeDateFormatting:YES]; 
    }); 
    return dateFormatter; 
} 
संबंधित मुद्दे