2009-02-16 16 views
5

मैं कोड का एक खंड जो निम्नलिखित के समान है है? ऐसा प्रतीत होता है कि आप तेजी से गणना के साथ एक संग्रह को म्यूट नहीं कर सकते हैं। यह एक त्रुटि का परिणाम है:ऑब्जेक्टिव-सी 2.0 और फास्ट गणन फेंक अपवाद

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <NSCFArray: 0x396000> was mutated while being enumerated.' 

इसे हल करने का सबसे अच्छा तरीका क्या है?

उत्तर

3

The Objective-C 2.0 Programming Language से, आप संशोधित नहीं कर सकते संग्रह प्रगणित किया जा रहा:

Enumeration is “safe”—the enumerator has a mutation guard so that if you attempt to modify the collection during enumeration, an exception is raised.

6

संग्रह की एक कॉपी बनाएं और उस के माध्यम से पुनरावृति। फिर आप बिना किसी समस्या के स्वैप कर सकते हैं या अपने मूल संग्रह में जोड़ सकते हैं।

12

खैर इसे हल करने रास्ता सरणी उत्परिवर्तित करने के लिए नहीं है (उदाहरण के लिए एक वस्तु को जोड़ने) जबकि यह :) गणना

समस्या है कि यहाँ/हटाने के तत्व जोड़कर सरणी को संशोधित करने के लिए गणन मूल्यों का कारण बन सकता है अमान्य हो गया, इसलिए यह एक समस्या क्यों है।

अपने मामले में इसे हल करने का सबसे आसान तरीका आपके कोड में बग को ठीक करना है। आपका कोड सरणी में प्रत्येक आइटम के लिए "अन्य जोड़ें" खंड कर रहा है और मुझे पूरा यकीन है कि आप जो चाहते हैं वह नहीं है।

इसे आजमाएं;

bool found = false; 
for (NSDictionary *tmp in aCollection) 
{ 
    if ([[bar valueForKey:@"id"] isEqualToString:[tmp valueForKey:@"id"]]) 
    { 
     found = true; 
     break; 
    } 
} 

if (!found) 
{ 
[aCollection addObject:bar]; 
} 
6

लाइन

[aCollection addObject:bar] 

आपकी समस्या है। आप इसे गणना करते समय aCollection संशोधित नहीं कर सकते हैं। बेहतर दृष्टिकोण अस्थायी NSMutableArray बनाना होगा, उसमें bar जोड़ें, फिर अपने अस्थायी सरणी के साथ [aCollection addObjectsFromArray:] पर कॉल करें।

उदाहरण के लिए:

NSMutableArray *foundObjects = [NSMutableArray array]; 
for (NSDictionary *aDictionary in aCollection) { 
    if ([[bar objectForKey:@"id"] isEqual:[aDictionary objectForKey:@"id"]]) 
     break; 

    [foundObjects addObject:bar]; 
} 
[aCollection addObjectsFromArray:foundObjects]; 
+7

क्यों परेशान दे देंगे यह सब जब आप सिर्फ '[एक चयन प्रति]' पर फिर से शुरू कर सकते हैं? –

2

बस सरणी कॉपी। नहीं तो आप संग्रह है कि आप पुनरावृत्ति कर रहे हैं के साथ खिलवाड़ कर रहे हैं:

for (NSDictionary *tmp in aCollection.copy) { 
    if ([[bar valueForKey:@"id"] isEqualToString:[tmp valueForKey:@"id"]]) 
    break; 
    [aCollection addObject:bar]; 
} 
+0

डाउनवॉट्स? क्यूं कर? –

1

बाकी सब उपयोगी जवाब है, जो सभी सही लग रहे हैं की पेशकश की है।

आपका कोड, ऐसा नहीं करता है जो वे सोचते हैं। यह शायद ऐसा नहीं करता जो आपको लगता है कि यह करता है।

यदि आप गणनाकर्ता द्वारा लौटाई गई पहली वस्तु बार से मेल नहीं खाती है तो आप संग्रह में 'बार' जोड़ने का प्रयास करते हैं।

हर कोई सोचता है कि यदि आप संग्रह में मौजूद नहीं हैं तो आप बार जोड़ने की कोशिश कर रहे हैं।

मुझे संदेह है कि आपने पाइथन निर्माण किया है और इसे गलत तरीके से पोर्ट किया है।

+0

यह एक टिप्पणी नहीं है एक प्रश्न। आप शायद सही हो, हालांकि :) –

0

हल

मैं CoreData गणन वस्तुओं में एक ही समस्या है।

, उप वस्तु जो सरणी में निर्भर करता है जिस पर लूप चल रहा है

तरह परिवर्तन नहीं करते अगर मैं बदल/वस्तु को संशोधित करते हुए पाश पर .. यह इस त्रुटि

for (LoadList *objLL in ArrLoadList) {    // here Enumaration is Going on 
     // here i has removed objects in ArrLoadList and reassign the ArrLoadList .. 
     // it will gives me this error 
     // So Don't change the Main Array object 
} 
संबंधित मुद्दे