2012-02-10 11 views
16

Apple's multithreading docsNSIndexPath को थ्रेडसेफ के रूप में सूचीबद्ध न करें या नहीं! एक अपरिवर्तनीय वर्ग के रूप में, मैं आमतौर पर थ्रेडसेफ होने की अपेक्षा करता हूं।एनएसआईएनएक्सएक्सपाथ थ्रेडसेफ है?

पहले, मुझे यकीन है कि दस्तावेज यह बताता था कि NSIndexPath उदाहरण साझा किए गए थे और वैश्विक स्तर पर अद्वितीय थे। ऐसा लगता है कि अब गायब हो गया है, मुझे संदेह है कि आईओएस 5/मैक ओएस एक्स 10.7 के लिए डिज़ाइन संशोधित किया गया था।

मैक ओएस एक्स 10.6 (हिम तेंदुए) पर ग्राहकों से बहुत सारी क्रैश रिपोर्ट देख रहा हूं जो इंडेक्स पथ तक पहुंचने का प्रयास कर दुर्घटनाग्रस्त प्रतीत होता है। इस प्रकार मुझे आश्चर्य है: वास्तविक उदाहरण थ्रेड सुरक्षित हैं, लेकिन साझा कैश से उन्हें खींचने के लिए तर्क नहीं है? क्या किसी के पास कोई अंतर्दृष्टि है?

Dispatch queue: com.apple.root.default-priority 
0 libobjc.A.dylib 0x96513f29 _cache_getImp + 9 
1 libobjc.A.dylib 0x965158f0 class_respondsToSelector + 59 
2 com.apple.CoreFoundation 0x948bcb49 ___forwarding___ + 761 
3 com.apple.CoreFoundation 0x948bc7d2 _CF_forwarding_prep_0 + 50 
4 com.apple.Foundation 0x994b10c5 -[NSIndexPath compare:] + 93 
5 com.apple.Foundation 0x99415686 _NSCompareObject + 76 
6 com.apple.CoreFoundation 0x948af61c __CFSimpleMergeSort + 236 
7 com.apple.CoreFoundation 0x948af576 __CFSimpleMergeSort + 70 
8 com.apple.CoreFoundation 0x948af38c CFSortIndexes + 252 
9 com.apple.CoreFoundation 0x948fe80d CFMergeSortArray + 125 
10 com.apple.Foundation 0x994153d3 _sortedObjectsUsingDescriptors + 639 
11 com.apple.Foundation 0x994150d8 -[NSArray(NSKeyValueSorting) sortedArrayUsingDescriptors:] + 566 

मेरे लिए, कि एक NSIndexPath उदाहरण एक deallocated उदाहरण के लिए खुद की तुलना करने की कोशिश कर रहा है:

यहाँ BTW एक उदाहरण स्टैक ट्रेस है।

+1

आप उन इंडेक्स पथों के साथ क्या करते हैं, और क्रैश कहां होता है? मल्टीथ्रेडिंग बग रहस्यमय हैं, 'एनएसआईएनएक्सएक्सपीएटी' के साथ एक क्रैश का मतलब यह नहीं है कि समस्या 'NSIndexPath' में है। – hamstergene

+0

मैं एक fetch अनुरोध निष्पादित करता हूं और फिर परिणामों को उनके '-indexPath' विधि के आधार पर सॉर्ट करता हूं। आंतरिक रूप से, हर बार इसे कहा जाता है, यह विधि एक सूचकांक पथ बनाता है जो पेड़ में वस्तु की स्थिति का प्रतिनिधित्व करती है। यह मेरा संदेह है कि मुझे साझा किया जा रहा है 'एनएसआईएनएक्सएक्सपाथ' जिसे बाद में किसी अन्य धागे के बाद हटा दिया जा रहा है। –

+0

एनएसआईएंडएक्सपाथ कहां से उत्पन्न है? क्या यह प्राप्त वस्तु की संपत्ति है? –

उत्तर

4

अब तक सबसे अच्छा जवाब मेरे पास है के रूप में मुझे लगता है यह है: NSIndexPath

, OS X 10.7 तथा iOS 5 के रूप में धागा सुरक्षित है। इससे पहले, उदाहरण धागे सुरक्षित हैं क्योंकि वे अपरिवर्तनीय हैं, लेकिन मौजूदा उदाहरणों का साझा पुनर्प्राप्ति नहीं है।

मेरी विधि है जो मांग-पर अनुक्रमण रास्तों रिटर्न के लिए

, मैं इस किया था:

- (NSIndexPath *)indexPath; 
{ 
    NSIndexPath *result = … // create the path as appropriate 

    return [[result retain] autorelease]; 
} 

कोड की है कि अंतिम पंक्ति को लागू करने के बाद से, हम सूचकांक पथ से अधिक नहीं क्रैश रिपोर्ट किया है।

सूचकांक पथ -indexPathByAddingIndex: या +indexPathWithIndex: द्वारा बनाए गए हैं।

जो परिणाम मैं देख रहा हूं, मुझे यह सुनिश्चित करने में मदद मिलती है कि (10.7/आईओएस 5 से पहले) ये विधियां मौजूदा NSIndexPath उदाहरण लौट रही हैं।उस उदाहरण को वर्तमान धागे द्वारा किसी भी तरह से बनाए रखा नहीं गया है, इसलिए थ्रेड जिसने पहली बार उदाहरण बनाया है (हमारे मामले में मुख्य) पथ को जारी कर रहा है (संभवतः ऑटोरेलीज पूल पॉपिंग के माध्यम से) और हमारे कार्यकर्ता धागे को एक लटकते सूचक के साथ छोड़कर, जो प्रश्न में देखा गया है, जो दुर्घटनाग्रस्त हो जाता है।

यह सब थोड़ा डरावना है, क्योंकि यदि मेरा विश्लेषण सही है, तो retain/autorelease नृत्य मैंने जो जोड़ा है, वह बस एक दौड़ की स्थिति को दूसरे, कम संभावना वाले स्थान के साथ बदल रहा है।

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

1

ऐप्पल विशेष रूप से एनएसआईएंडएक्सपैथ को थ्रेड सुरक्षित के रूप में सूचीबद्ध नहीं करता है, लेकिन वे कहते हैं कि अपरिवर्तनीय कक्षाएं आम तौर पर सुरक्षित और उत्परिवर्तनीय होती हैं। चूंकि NSIndexPath अपरिवर्तनीय है, इसलिए यह सुरक्षित है कि यह थ्रेड सुरक्षित है।

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

ऐसा लगता है कि आपकी बग एक ऑटोरेलीज पूल या किसी अन्य तंत्र का उपयोग करने की अधिक संभावना है जो आपके ऑब्जेक्ट को आपके नियंत्रण के बाहर एक समय में रिलीज़ करने का कारण बनती है। आपको शायद यह सुनिश्चित करना चाहिए कि किसी समवर्ती रूप से एक्सेस की गई वस्तुओं को लंबे समय तक रहने वाले वर्गों के गुणों में संग्रहीत किया जाता है ताकि आप अपनी उम्र को नियंत्रित कर सकें।

एक ऑटोरेलेज्ड ऑब्जेक्ट बनाना और इसे किसी अन्य थ्रेड से एक्सेस करना आपके द्वारा सभी मजबूत संदर्भों को हटा दिए जाने के बाद एक खतरनाक रेसिंग गेम है जो इस बात पर ध्यान दिए बिना कि समस्या में वस्तु "धागा है या नहीं सुरक्षित "।

+0

हां, मैं बहु थ्रेडेड कोड में खतरों की विविधता को समझता हूं। मैं इन वस्तुओं को एक धागे पर नहीं बना रहा हूं और उन्हें एक और थ्रेड पर रहने की उम्मीद कर रहा हूं। मैं कार्यकर्ता थ्रेड पर उनके लिए 'NSIndexPath' पूछकर ऑब्जेक्ट्स बना रहा हूं। मेरी समझ यह है कि 10.6 और इससे पहले, 'एनएसआईएनडीएक्सपाथ' उदाहरण वैश्विक रूप से साझा किए जाते हैं। मुझे संदेह है कि इस वैश्विक कैश व्यक्तिगत उदाहरणों की बजाय थ्रेड सुरक्षित नहीं है। –

+1

यदि आप पुराने दस्तावेज़ सेट डाउनलोड करते हैं और सभी दस्तावेज़ सेट खोजते हैं तो आप अभी भी एक्सकोड में ऑर्गनाइज़र में आईओएस 4.3/ओएस 10.6 डॉक्स पढ़ सकते हैं। मुझे वह रेखा मिली है जिसका आप उल्लेख कर रहे हैं: "NSIndexPath ऑब्जेक्ट्स अनन्य और साझा किए गए हैं। यदि निर्दिष्ट इंडेक्स या इंडेक्स वाले इंडेक्स पथ पहले से मौजूद हैं, तो उस ऑब्जेक्ट को एक नए इंस्टेंस के बदले वापस कर दिया जाता है।" और हां, ऐसा लगता है कि यह नवीनतम दस्तावेज़ों में हटा दिया गया है, इसलिए शायद आप एनएसआईएनएक्सएक्सपाथ के बारे में सही हैं कि 10.6 के तहत थ्रेड-सुरक्षित नहीं है। –

+0

आह, मैं भूल गया था कि आप अभी भी पुराने दस्तावेज़ों में जा सकते हैं! –

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

  • कोई संबंधित समस्या नहीं^_^