2010-04-07 12 views
9

कोड खंड का यह टुकड़ा मुझ पर गलती है, कोई विचार क्यों? allButtons एक NSMutableArray है, यह 3 वस्तुओं, शामिल a=0, b=1, ए और बी int प्रकार के होते हैंएनएसएमयूटेबलएरे में मूल्यों को कैसे स्वैप करें?

if(a != -1 && b!= -1){ 
    //Swap index in "allButtons" 
    id tempA = [allButtons objectAtIndex:a]; 
    id tempB = [allButtons objectAtIndex:b]; 
    [allButtons replaceObjectAtIndex:a withObject:tempB]; //Seg fault here????? 
    [allButtons replaceObjectAtIndex:b withObject:tempA]; 
    needLoad = false; 
    [self setUpButtons]; 
} 

संपादित करें:

NSMutableArray *allButtons = //fetch the array from Coredata. This work since I display the data onto the screen, plus, [allButtons count] return 3, and a=0, b=1 
f(a != -1 && b!= -1){ 
    //Swap index in "allButtons" 
    [allButtons exchangeObjectAtIndex:a withObjectAtIndex:b]; 
    needLoad = false; 
    [self setUpButtons]; 
} 
+0

यह यदि संभव हो तो वास्तविक त्रुटि संदेश पोस्ट करने के लिए, सहायक हो सकता है पारित करना होगा। यह कक्षा घोषणा को पोस्ट करने में भी मददगार होगा ताकि हम देख सकें कि सभीबटन एक संपत्ति है, और यदि हां, तो इसका मेमोरी प्रबंधन अर्थशास्त्र क्या है, आदि – jlehr

उत्तर

11

सिर्फ इसलिए कि आप ने कहा है

NSMutableArray *allbuttons = // something 

मतलब यह नहीं है कि यह निश्चित रूप से एक NSMutableArray है, यह सिर्फ संकलक का मानना ​​है कि कि यह एक NSMutableArray हो जाएगा मतलब है।

यदि यह कोरडाटा से है, तो शायद यह सिर्फ NSArray है, इसलिए जिस विधि कॉल को आप कोशिश कर रहे हैं वह काम नहीं करेगा - आपको असंगत चयनकर्ता या ऐसा कुछ मिल जाएगा।

आप इसे एक अस्थायी सरणी पहले

NSArray *coreData = // core data call 

// Create a mutable copy 
// NB This means that you are now working on a copy, not the original :) 
NSMutableArray *allButtons = [coreData mutableCopy]; 
+0

ty जो समस्या को ठीक करता है। –

+1

या सिर्फ एनएसएमयूटेबलएरे * allButtons = [कोरडाटा mutablecopy]; –

2

tempA रिलीज होने जा रही है जब आप पहली बार replaceObjectAtIndex कहते हैं। इसे कॉल करते समय इसे ध्यान में रखें ... मुझे नहीं पता कि tempA जारी करने के लिए आपके लिए गलती क्यों होगी, इसकी जांच करें कि dealloc शायद क्या करता है।

id tempA = [allButtons objectAtIndex:a]; 
NSLog(@"retain count for tempA: %i", [tempA retainCount]); 

आप इस स्तर पर 1 की गिनती बनाए रखने देखते हैं, तो:

चेक सत्यापित करें कि यह वास्तव में dealloc एड (बस जारी नहीं) replaceObjectAtIndex करने के लिए कॉल करके ऐसा तरह है tempA की गिनती को बनाए रखने है, तो अपने वस्तु tempAreplaceObjectAtIndex: को replaceObjectAtIndex

+0

'रिकॉउंट काउंटर वापस लौटें 3. –

+0

क्या आप इसे कॉल कर रहे हैं मुख्य धागा या एक माध्यमिक धागा? यदि आप इसे माध्यमिक धागे से बुला रहे हैं, तो क्या आपने ऑटो-रिलीज पूल बनाया है? –

22

पहले कॉल पर कॉल द्वारा dealloc एड किया जा रहा है पुराने वस्तु (tempA) जारी करेंगे, लेकिन यह एक SEG गलती का कारण नहीं होना चाहिए। जैसा कि @ ज़ोरान ने tempA के लिए retainCount लॉगिंग करने का प्रयास किया है और इसकी गणना सत्यापित की है।

इसके अलावा किसी सरणी में तत्वों को स्वैप करने के लिए, आपको replaceObjectAtIndex:withObject के बजाय exchangeObjectAtIndex:withObjectAtIndex का उपयोग करना चाहिए। यह आईफोन 2.0 से समर्थित है।

+0

मैं 'एक्सचेंज ऑब्जेक्टएट इंडेक्स: withObjectAtIndex'' का प्रयास करता हूं और यही मुझे 'अपरिपक्व अपवाद' एनएसआईएनवालिडएर्गमेंट एक्सेप्शन 'के कारण ऐप को समाप्त कर रहा है, कारण:' *** - [_ PFArray ExchangeObjectAtIndex: withObjectAtIndex:]: अपरिचित चयनकर्ता 0x3a35a30'' उदाहरण के लिए भेजा गया है। बीटीडब्लू, 'रिकॉउंट काउंटर' वापस लौटें 3. –

+0

आईफोन एसडीके का कौन सा संस्करण आप उपयोग कर रहे हैं? साथ ही, कृपया उस कोड को पोस्ट करें जहां आप 'एनएसएमयूटेबलएरे' बना रहे हैं, और 'एक्सचेंज ऑब्जेक्ट..' – Anurag

+0

का उपयोग करके मैं बस अपना कोड संपादित करता हूं। TYVM –

0

कृपया object ownership पर कोको नियमों को पढ़ें और समझें। ध्यान दें कि आप वस्तुओं tempA और tempB द्वारा संदर्भित से अधिक स्वामित्व का दावा नहीं किया और इसलिए आप निम्नलिखित ध्यान करना होगा:

एक प्राप्त वस्तु सामान्य रूप से विधि उस में प्राप्त किया गया था ... के भीतर मान्य रहने के लिए गारंटी है (यद्यपि आपको किसी ऑब्जेक्ट को संशोधित करने के लिए भी देखभाल करना चाहिए, जिससे आपको अन्य ऑब्जेक्ट प्राप्त हुआ)। यह विधि वस्तु को अपने आवेदक को सुरक्षित रूप से वापस कर सकती है।

असल में, पंक्ति:

[allButtons replaceObjectAtIndex:a withObject:tempB]; 

बन सकते हैं tempA पुनः आवंटित की जाती किया जाना है। इसका मतलब है कि बाद की रेखा सभी बटनों को एक अमान्य वस्तु को एक सतत संदेश भेजने का कारण बनती है, इसलिए सीजी गलती। समस्या को ठीक करने के लिए, आपको स्वैप से पहले tempA को बनाए रखना होगा और उसे रिलीज़ करना होगा या इसके बाद इसे स्वतः स्वामित्व करना होगा।

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

0

इस विधि का उपयोग करने के लिए कन्वर्ट करने के लिए appropritate सूचकांक

exchangeObjectAtIndex:withObjectAtIndex: 
संबंधित मुद्दे