जैसा कि आप जानते हैं, कंटेनर/संग्रह थ्रेड सुरक्षित होने की गारंटी नहीं है। क्या हो सकता है यदि आप कॉपी या पढ़ने के दौरान सरणी बदलते हैं? बहुत सारी चीज। स्पष्ट मामले यह है कि उस समय यह फिर से आवंटित हो सकता है, यह आपके लिए एक अमान्य संदर्भ पास कर सकता है या वापस कर सकता है (उदा। हाल ही में हटाया गया), या यह उन वस्तुओं तक पहुंच सकता है जो जारी किए गए हैं (किसी अन्य थ्रेड से)। उन चीजों के अतिरिक्त जो आपके ऐप को क्रैश कर देंगे या अन्य यूबी का कारण बनेंगे, यह सही या सुसंगत मान वापस नहीं कर सकता है। यह डेटा की गलत व्याख्या है। न तो अच्छे हैं।
आप परीक्षण परिदृश्य - थ्रेडिंग समस्याओं को पुन: पेश करना मुश्किल है और आप वास्तव में सभी मामलों को कभी भी कवर नहीं कर सकते हैं। चूंकि ऑब्जेक्ट स्वयं थ्रेड सुरक्षा की गारंटी नहीं देता है - आपके कार्यान्वयन को एक समय में एक थ्रेड पर पहुंच/उत्परिवर्तन/इंटरैक्शन प्रतिबंधित करना पड़ता है। ऑब्जेक्ट से निपटने के दौरान जो मल्टीथ्रेड किए गए संदर्भों में उपयोग किया जाता है: जब भी आप ऑब्जेक्ट के परिवर्तनीय स्थिति से जानकारी तक पहुंच या क्वेरी करते हैं, तो आपको ऑब्जेक्ट (जैसे लॉक के साथ) की रक्षा करनी चाहिए। इसलिए, आप इसका उपयोग करते समय इसे लॉक करते हैं। लॉक/प्रतिलिपि/अनलॉक/उपयोग प्रति भी आम है। एक एनएसएमयूटेबलएरे के लिए, उत्परिवर्तनीय राज्य के उदाहरण इसकी सभी वस्तुएं और इसकी गणना होगी। इसके संचालन और उत्परिवर्तन वस्तु के उत्परिवर्तनीय राज्य का भी उपयोग करते हैं, इसलिए वे प्रतिबंधित हैं।
यदि आप केवल इस ऑब्जेक्ट को एक थ्रेड से उपयोग करते हैं, तो स्पष्ट रूप से इसे लॉक करने की आवश्यकता नहीं है। यह भी एक कारण है कि प्रतिलिपि द्वारा गुजरने और अपरिवर्तनीय रूप धारण करने से ज्यादातर मामलों में दोनों अच्छे विचार होते हैं।आपको प्रत्येक ऑब्जेक्ट के लिए लॉक की आवश्यकता नहीं है, ऑब्जेक्ट के लिए एक गार्ड जो इसे रखता है अक्सर थ्रेड सुरक्षा के लिए कक्षा तैयार करने का एक अच्छा तरीका होता है।
अद्यतन
... तो क्या होगा? प्रति (सभी 5 वस्तुओं होते हैं क्योंकि वे कहीं और वैसे भी बने रहते हैं? वे 4 शामिल है? (यहां तक कि युक्त 4 मेरे लिए पर्याप्त है) अगर आप ठीक से संग्रह पहरा नहीं किया है, यह एक अपवाद फेंका है?
। अपरिभाषित व्यवहार के रूप में रूप में अच्छा है और आप भाग्यशाली हैं अगर यह दुर्घटनाओं
आप उचित सावधानी बरतने की अपरिभाषित व्यवहार से बचने की जरूरत अपने कार्यक्रम कि डोमेन काम कर रहा है जब यह उचित रूप से सुरक्षित नहीं है
विस्तृत करने के।।: वस्तुओं को बाहरी रूप से बनाए रखने से केवल अपरिभाषित व्यवहार \ ior की संभावना कम हो जाती है, लेकिन यह निश्चित रूप से इसे खत्म नहीं करती है। अधिक ई परिणामों के उदाहरणों में अपवाद, segfaults, पढ़ने या स्मृति लिखने शामिल हैं जो एक और सक्रिय आवंटन के रूप में प्रयोग किया जाता है (जो बहुत ही रहस्यमय मुद्दों के रूप में दिखाया जा सकता है जो पुनरुत्पादन के लिए लगभग असंभव हो सकता है)।
मैं आपको उचित रूप से सुरक्षा करने या एक और दृष्टिकोण लेने के लिए प्रोत्साहित करता हूं। यूबी EVIL है :)
मुझे दो दिन पहले एक ही समस्या थी, लेकिन मैं एक सरणी से वस्तुओं को हटा रहा था और दूसरे में गणना कर रहा था। संशोधित सरणी के बारे में एक अपवाद मिला। यदि arrayWithArray: तेज़ गणना का उपयोग करता है (मुझे नहीं पता), यह एक अपवाद फेंक देगा। –
मुझे लगता है कि आप मेरी समस्या को समझते हैं! मैं यह निर्धारित करने की कोशिश कर रहा हूं कि एक अपवाद फेंक दिया जाएगा या नहीं। लेकिन मैं इसे सत्यापित करने के लिए एक परीक्षण नहीं बना सकता क्योंकि मैं प्रतिलिपि बनाते समय सरणी को संशोधित करने के लिए एक और थ्रेड समन्वयित नहीं कर सकता। – xcoder