2011-01-13 14 views
20

मैंने इस प्रश्न को पोस्ट करने से पहले कई मौकों पर "स्थैतिक" पर पढ़ा है। हालांकि मैं अभी भी "आह" खोज रहा हूं।UITableViewCell पहचानकर्ताओं में स्थिर कीवर्ड क्यों उपयोग किया जाता है?

UITableView की स्थिरता के संदर्भ में मैंने कोड के प्रत्येक टुकड़े में सेल आइडेंटिफ़ायर में आता है। हाल ही में एक CellForRowAtIndexPath में उदाहरण के लिए:

static NSString *defaultIndentifier = @"Managed Object Cell Identifier"; 

मेरा प्रश्न कारण है कि हम की जरूरत है और प्रयोग "स्थिर" है?

उत्तर

11

ताकि यह केवल एक बार बनाया जाएगा। यदि यह स्थैतिक नहीं है, तो आप संदेश भेजते समय हर बार एक बनायेंगे (जो बहुत है)

+0

यदि "हर बार एक बनाना" से आपका मतलब है "एक स्थिर पॉइंटर को एक स्टैक वैरिएबल में दबाकर" सुनिश्चित करें। लेकिन यह 'int i = 3;' कहने जैसा महंगा है, क्योंकि संकलक ने स्थिरता में '@" पहचानकर्ता "को संकलित किया है। एकमात्र समय स्थिर वास्तव में लाभ होगा यदि स्ट्रिंग को स्थिर स्ट्रिंग का उपयोग करने के बजाय रनटाइम पर बनाया गया है। –

+1

यह अभी भी एक लाभ है। जब भी विधि चलती है तो यह दो प्रोसेसर चक्रों में कटौती करता है (जो कई बार हो सकता है)। – ughoavgfhw

+0

@ughoavgfhw हाँ, लेकिन क्या यह आपके बाइनरी को बड़ा नहीं बनाता है और आपके ऐप को अधिक मेमोरी का उपयोग करता है? – ma11hew28

18

यहां कोई वास्तविक लाभ नहीं है। यह ज्यादातर पाठक को सिर्फ एक संकेत है कि इस विशेष बिट कोड में सभी कोशिकाओं के लिए समान मूल्य का उपयोग किया जाता है। चूंकि पहचानकर्ता स्वयं एक स्थिर स्ट्रिंग है, यह स्मृति के एक अपरिवर्तनीय खंड में संकलित हो जाता है और हर बार एक ही सूचक के रूप में संदर्भित किया जाता है, उदा। यदि आप static कीवर्ड को हटाते हैं तो भी स्ट्रिंग बनाने में कोई लागत नहीं है।

+0

"पहचानकर्ता स्वयं एक निरंतर स्ट्रिंग है" पर अच्छी अंतर्दृष्टि – Philip007

0

मेरा अनुमान है कि स्ट्रिंग को स्थिर के रूप में घोषित करके, हर बार यह -dequeueReusableCellWithIdentifier:CellIdentifierforIndexPath: में पारित हो जाता है कि प्रत्येक पॉइंटर का उपयोग प्रत्येक बार किया जाता है (जैसा कि स्थिर रूप से घोषित चर केवल ढेर पर आवंटित होते हैं, प्रोग्राम के निष्पादन में बहुत जल्दी)

[NSString -isEqualToString:] सबसे पहले संभवतः एक सूचक की तुलना करने के लिए लागू किया गया है, इसके बाद एक चरित्र-वार तुलना फॉलबैक के रूप में तुलना की जाती है, जिसे मैं प्रत्येक पुनरावृत्ति पर कुछ चक्रों को बंद कर सकता हूं।

इस से लाभ प्राप्त करने के लिए बहुत कुछ नहीं है, क्योंकि (ए) टेबल सेल पुन: आबादी आमतौर पर कोशिकाओं के बहुत छोटे सेट पर चलती है, और अच्छी तरह अनुकूलित होती है, और (बी) टेबल रीफ्रेश विस्फोट होता है - यह एक बार होता है और तब तक तब तक नहीं होता जब तक कि उपयोगकर्ता स्क्रॉल या एप्लिकेशन तर्क सामग्री को बदल नहीं लेता - यदि आप -reloadTable को दूसरी बार 100 बार कॉल करना समाप्त करते हैं, तो आपके एप्लिकेशन तर्क के साथ स्पष्ट रूप से कुछ गलत है।

मुझे संदेह है कि स्थैतिक कीवर्ड एक वेस्टिगियल विरासत सम्मेलन है - शायद दिन में वापस, ऐप्पल ने उचित स्ट्रिंग तुलना करने के बजाए पॉइंटर पर धोया था।

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

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