2010-02-25 15 views
5

मेरे iPhone अनुप्रयोग क्रैश हो रहा है, और मैं अतीत खूनी सप्ताह के दौरान यह एक लाइन के लिए नीचे यह संकुचित है:उद्देश्य-सी एक एनएसएआरएआर ठीक से कॉपी करें?

NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error]; 

मैं ऊपर से सही परिणाम हो रही है, लेकिन यह तक पहुँचने के बाद ऐप्लिकेशन क्रैश (EXC_BAD_ACCESS)। मैं सिर्फ fetchResults की सामग्री कैसे कॉपी करूं ताकि मैं इसके साथ खेल सकूं?

मैं

NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults]; 
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]]; 
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]]; 

की कोशिश की है, लेकिन केवल एक चीज है कि एप्लिकेशन क्रैश नहीं होता

NSArray *retVal = [[NSArray alloc] initWithArray:nil]; 

किसी ने मुझे बाहर करने में मदद कर सके है? मुझे लगता है कि मुझे ओब्जे-सी मेमोरी प्रबंधन में एक सबक चाहिए।

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

NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error]; 
[request release]; 
NSMutableArray *retVal = [NSMutableArray arrayWithCapacity:0]; 
for(Job *job in fetchResults){ 
    //NSLog(@"dev: %@",job.lastmod_device); 
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
          [job.jobkey copy], @"entitykey", 
          [NSNumber numberWithInt:[job.lastmod_device timeIntervalSince1970]], @"job_lastmod_device", 
          [NSNumber numberWithInt:[job.lastmod_server timeIntervalSince1970]], @"job_lastmod_server", 
          [NSNumber numberWithInt:[job.customer.lastmod_device timeIntervalSince1970]], @"customer_lastmod_device", 
          [NSNumber numberWithInt:[job.customer.lastmod_server timeIntervalSince1970]], @"customer_lastmod_server", 
          [NSNumber numberWithInt:[job.productionschedule_lastmod_device timeIntervalSince1970]], @"productionschedule_lastmod_device", 
          [NSNumber numberWithInt:[job.productionschedule_lastmod_server timeIntervalSince1970]], @"productionschedule_lastmod_server", nil]; 
    //NSLog(@"dict: %@", dict); 
    [retVal addObject:dict]; 
} 
return retVal; 

और कोड है कि इस विधि कॉल: यहाँ कोड को अधिक अच्छी तरह उदाहरण है कि दुर्घटनाओं है

NSArray *arr2 = [self retrieveJobs]; 

(है कि यह है, मैं भी का उपयोग कभी नहीं परिवर्तनीय)

संपादित करें 2: यहां तक ​​कि लूप के लिए खाली के साथ प्राप्त किए गए परिणाम को फिर से चालू करना और fetchResults ऑब्जेक्ट के साथ कुछ भी नहीं करना ऐप क्रैश करता है। यह संभव ही कैसे है?

+0

कृपया दिखाएं कि आप परिणाम कहां एक्सेस करते हैं। –

+0

उपरोक्त संपादन देखें – kbanman

उत्तर

2

NSArray *retVal = [fetchResults retain] आपके लिए सब कुछ रखना चाहिए। यह एक प्रतिलिपि नहीं बनाता है, लेकिन मुझे उम्मीद है कि वास्तव में आप जो करने की कोशिश कर रहे हैं वह वास्तव में नहीं है। आपके पहले प्रयास में एक प्रतिलिपि बनाना चाहिए। यदि आप सावधान नहीं हैं, तो वे सभी लीक करने के लिए प्रवण हैं (आपका दूसरा उदाहरण लीक की गारंटी है)। क्या आप वाकई प्रोग्राम में कुछ और नहीं कर रहे हैं जिससे कोड का यह हिस्सा असफल हो जाता है?

NSArray *retVal = [fetchResults copy]; 
NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults]; 

उन वापसी के दोनों आप के लिए सरणियों बनाए रखा:

यहाँ एक वास्तविक प्रतिलिपि कर कि अगर तुम क्या चाहते हो के लिए कुछ विकल्प हैं।

1

क्या आप सुनिश्चित हैं कि प्राप्तकर्ता अनुरोध डेटा लौटा रहा है? प्रलेखन के अनुसार:

रिसीवर से प्राप्त अनुरोध और रिसीवर के लगातार स्टोर समन्वयक से जुड़े लगातार स्टोर से निर्दिष्ट मानदंडों को पूरा करने वाले ऑब्जेक्ट्स की एक सरणी। अगर कोई त्रुटि होती है, तो शून्य वापस आती है। यदि कोई ऑब्जेक्ट अनुरोध द्वारा निर्दिष्ट मानदंडों से मेल नहीं खाता है, तो एक खाली सरणी लौटाती है।

इसके अलावा, क्या आप उस कोड को दिखा सकते हैं जहां आप सरणी का उपयोग करते हैं? क्या यह वही विधि है जहां आप fetch अनुरोध निष्पादित कर रहे हैं?

19

आप थका रहे हैं; कोड की इन पंक्तियों में से ...

NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults]; 
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]]; 
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]]; 

बाद वाले दो सरल रिसाव हैं।पहला प्रतिलिपि बनाने का एक तरीका है, लेकिन retVal = [fetchResults copy]; एक प्रतिलिपि बनाने का एक बेहतर तरीका है।

लेकिन, निश्चित रूप से, आप को सभी पर प्रतिलिपि की आवश्यकता नहीं है। यह समस्या नहीं है। आप यह कहते हैं कि एकमात्र चीज जो क्रैश नहीं करती है वह एक खाली परिणाम सेट है।

यह दो चीजों में से एक को इंगित करता है; या तो आपका परिणाम सेट दूषित है (संभावना नहीं है) या आप परिणाम सेट को गलत तरीके से एक्सेस कर रहे हैं (संभवतः)।

"थ्रैशिंग" यह है कि आपने क्रैश के बैकट्रैक या क्रैश के स्थान को शामिल किए बिना किसी दुर्घटना के बारे में एक प्रश्न पूछा है। उनको जोड़ें और आपको कम क्रम में उत्तर मिलेगा।

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

1
NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults]; 
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]]; 
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]]; 

क्या आप सुनिश्चित हैं कि fetchResults में परिणाम शामिल हैं? क्योंकि एक मौका हो सकता है कि "fetchResults" ऑब्जेक्ट स्वयं जारी हो गया है और कुछ कचरा स्थान पर इंगित करता है। यही कारण है कि आप दुर्घटनाग्रस्त हो रहे हैं। जांचें और सूचित करें कि fetchResults मान्य वस्तु है या नहीं।

0

मूल के संदर्भ के बिना एक वास्तविक प्रति प्राप्त करने के लिए, आपको एक डीईईपी प्रतिलिपि करने की आवश्यकता होगी। एक विधि सरणी को संग्रहित करना और इसे वापस एनएसएआरएआरए में अनारक्षित करना है।

Collections with IOS

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