2013-05-24 11 views
7

मेरे पास एक कक्षा है जिसमें NSSet है। यही कारण है कि वस्तु _collectibles कहा जाता है, और एक विधि में, मैं कुछ प्रसंस्करण करने के लिए की तरह कुछ है कि सेट की एक प्रतिलिपि बनाने,:विचित्र एनएसएससेट क्रैश की प्रतिलिपि

NSSet* collectibleCopy = [_collectibles copy]; 

व्यवहार में, मैं देख रहा हूँ इस नियमित रूप से इस संदेश के साथ दुर्घटना:

[__NSPlaceholderSet initWithObjects:count:]: attempt to insert nil object from objects 

मैं करने के लिए ऊपर दिए गए कोड को बदलने के द्वारा समस्या हल कर ली:

NSMutableSet* collectibleCopy = [[NSMutableSet alloc] initWithCapacity: [_collectibles count]]; 
for (id thing in _collectibles) { 
    [collectibleCopy addObject: thing]; 
} 

और अब मैं अब इस तरह के किसी भी दुर्घटना पुन: पेश कर सकते हैं। मैं सट्टेबाजी कर रहा हूं [copy] अधिक कुशल है, और मैं इसका उपयोग करना चाहूंगा, लेकिन मुझे पता नहीं चल सकता कि यह पूरी तरह से भद्दा क्यों है!

अद्यतन: जबकि पूरे संदर्भ स्पष्टीकरण की एक टन ले जाएगा, मेरे लिए कुंजी इस सुलझाने थे कि, एक, कोड इस तरह से लागू किया गया था:

NSBlockOperation* operation = [NSBlockOperation blockOperationWithBlock: ^{ 
    [thing doStuff]; 
}]; 

[operationQueue addOperation: operation]; 

और है कि मैं था, मूल रूप से एक बनाने के द्वारा चीजें धीमी की गुच्छा, एक कतार thusly प्रारंभ के लिए 2 धागे चल 2 धागे के साथ एप्लिकेशन को पकड़ने:

operationQueue.maxConcurrentOperationCount = 1; 

कौन सा मैं असंभव सोचा। सुराग यह था कि दूसरा धागा [NSAutoreleasePool drain] में था, जिसने मुझे यह जानने के लिए प्रेरित किया कि NSOperationQueue जब भी चाहें autorelease सामान कर सकते हैं। आप के लिए

+0

मैं आपकी बग को पुन: उत्पन्न करने में सक्षम नहीं था। क्या आप संदर्भ के लिए थोड़ा और कोड पोस्ट कर सकते हैं? – aLevelOfIndirection

+0

यह सेट है कि आप कोर डेटा रिलेशनशिप की प्रतिलिपि बना रहे हैं? –

+0

पूरे संदर्भ के लिए कोड की एक बड़ी ढेर की आवश्यकता होगी। :) – GoldenBoy

उत्तर

2

चाहेंगे

NSSet* collectibleCopy = [NSSet setWithSet:_collectibles] 

काम करता है?

+0

यह हो सकता है- मैं अनुमान लगा रहा हूं कि यह क्रैश नहीं हुआ (मेरा अन्य उत्तर देखें) तेजी से पुनरावृत्ति बनाम अर्थशास्त्र के बारे में कुछ था। एनएससीपीआईसी प्रोटोकॉल के लिए जो भी एनएसएसटी करता है। – GoldenBoy

2

ठीक है, इसलिए वास्तव में इसे समझने के लिए हज़ह।

यह चाल यह थी कि यह ऑपरेशन एसिंक NSOperationQueue पर किया गया था। टीआईएल कि NSOperationQueues AutoreleasePools है, लेकिन वे जीसीडी के विवेकानुसार सूख जाते हैं। इस मामले में, पिछले ऑपरेशन से पूल को एक साथ अन्य थ्रेड पर निकाला जा रहा था, जिससे एक अपारदर्शी समवर्ती संशोधन समस्या की मात्रा बढ़ जाती है।

समाधान:

@autoreleasepool ब्लॉक जिस पर यह कोड लागू किया गया के अंदर। यह नाली के बजाय ब्लॉक के हिस्से के रूप में नाली का कारण बनता है, और मेरी दौड़ की स्थिति दूर हो जाती है।

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