2010-02-11 13 views
5

के दूसरे डालने पर विफल रहता है मैं एक NSFetchedResultsController का उपयोग कर रहा एक तालिका दृश्य एक अनुभाग है कि में लाए जाने प्रबंधित वस्तुओं को प्रदर्शित करने का प्रबंधन करने के। तालिका खाली हो जाती है और उपयोगकर्ता यूआई का उपयोग करके इसमें नई इकाइयां जोड़ सकता है। जैसा कि यह खड़ा है, पहली इकाई जोड़ते समय प्रोग्राम हमेशा काम करता है, और दूसरा जोड़ते समय हमेशा क्रैश होता है। कभी-कभी दुर्घटना पर कोई त्रुटि नहीं होती है और दूसरी बार अलग-अलग प्रकार की त्रुटियां होती हैं (कुछ नीचे शामिल हैं)। लॉग स्टेटमेंट्स और ट्रेसिंग के माध्यम से मैं देखता हूं कि प्रोग्राम NSFetchResultsController के प्रतिनिधि के नियंत्रक के बाद क्रैश हो जाता है WillChangeContent (जो [self.tableView startUpdates] को कॉल करता है;) विधि निकलती है, लेकिन मेरे कोड में किसी भी अन्य विधि से पहले कहा जाता है। यहां मेरे कोड के कुछ हिस्सों में से कुछ हैं। NSFetchedResultsController का विन्यास:NSFetchedResultsController आधारित तालिका देखें हमेशा इकाई

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Beer" 
            inManagedObjectContext:self.managedObjectContext]]; 

// Configure request's entity and predicate 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

NSString *expression = [NSString stringWithFormat:@"brewery.name LIKE \"%@\"", self.brewery.name]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:expression]; 
[fetchRequest setPredicate:predicate]; 
self.resultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                  managedObjectContext:self.managedObjectContext 
                   sectionNameKeyPath:nil 
                     cacheName:nil]; 
self.resultsController.delegate = self; 
[fetchRequest release]; 

NSError *error = nil; 
BOOL success = [resultsController performFetch:&error]; 
if (!success) { 
    NSLog(@"Error fetching request %@", [error localizedDescription]); 
} 

नई इकाई जोड़ना:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Beer" inManagedObjectContext:self.managedObjectContext]; 
Beer *beer = [[Beer alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext]; 
beer.name = beerName; 
beer.brewery = self.brewery; 

मैं एक अनुभाग के साथ टेबल प्रदर्शित समस्याओं के बारे में डॉक्स में चेतावनी देखा है, और मैं कोई लाभ नहीं हुआ है कि के लिए एप्पल के वैकल्पिक हल का इस्तेमाल किया है। वैसे भी उन विधियों को दुर्घटना से पहले बुलाया नहीं जा रहा है।

त्रुटियों मैं प्राप्त हो गया है में से कुछ:

Serious application error. Exception was caught during Core Data change processing: *** -[NSCFString compareObject:toObject:]: unrecognized selector sent to instance 0x4e808c0 with userInfo (null) 
Serious application error. Exception was caught during Core Data change processing: *** -[CALayer compareObject:toObject:]: unrecognized selector sent to instance 0x4e53b80 with userInfo (null) 
Serious application error. Exception was caught during Core Data change processing: *** -[UITextTapRecognizer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4ca5d70 with userInfo (null) 
Serious application error. Exception was caught during Core Data change processing: *** -[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x4e271a0 with userInfo (null) 
Serious application error. Exception was caught during Core Data change processing: *** -[NSCFNumber countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x4c96ee0 with userInfo (null) 

आप देख सकते हैं, त्रुटियों (जब एक प्रस्तुत किया गया था) संगत नहीं हैं, तब भी जब कोड में कोई परिवर्तन नहीं किया गया था।

किसी को भी यह पता लगाने कर सकते हैं मैं गलत क्या कर रहा हूँ?

+0

मेरे पास बिल्कुल वही त्रुटि है। क्या आप मुझे बता सकते हैं कि समस्या को हल करने के लिए आपने क्या किया? धन्यवाद। – zsong

उत्तर

4

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

मैं निम्नलिखित करना होगा: NSZombie

  • पर objc_exception_throw
  • भागो के लिए एक ब्रेकपाइंट डिबगर
  • में जोड़े जब अपवाद तब होता है

    1. बारी, स्मृति पते पर देखने के और देखें कि क्या पहुंचा जा रहा है और कहां है। यह इस मुद्दे को अलग करेगा और आपको बताएगा कि क्या हो रहा है। यह सहायक भी होगा, अगर यह आपके NSFetchedResultsController प्रतिनिधि विधियों को पोस्ट करने के लिए समस्या का खुलासा नहीं करता है, तो मैं देख सकता हूं कि उनमें कुछ अजीब बात है या नहीं।

      अतिरिक्त जानकारी के साथ मूल प्रश्न को अपडेट करने के लिए सर्वश्रेष्ठ।

    1

    नई संस्थाएं बनाने के लिए आपका कोड सभी अजीब है। क्या बजाय इस प्रयोग के बारे में: इसके अलावा

    Beer* beer = [NSEntityDescription insertNewObjectForEntityForName: @"Beer" 
        inManagedObjectContext: self.managedObjectContext]; 
    beer.name = @"Grolsch"; 
    

    , आप NSManagedObjectContext#save: बुला नहीं कर रहे हैं। लेकिन हो सकता है कि आप अपने कोड के एक हिस्से में ऐसा कर रहे हैं जिसे आपने अभी दिखाया था?

    +0

    नई इकाई बनाने के लिए दो विधियां बराबर हैं। जहां प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट बचाया जाता है, तब भी समस्या पर कोई प्रभाव नहीं पड़ता है। –

    1

    जब मैं इस विशेष समस्या को हल नहीं किया, मैं वर्ग है कि कार्यक्षमता मैं चाहता हूँ दे दी है और समस्या पैदा होती है कारण नहीं लिखने के लिए एक अलग दृष्टिकोण लिया। मैं अभी भी NSFetchedResultsController का उपयोग कर रहा हूं, लेकिन सभी चार प्रतिनिधि विधियों को लागू करने के बजाय, मैं केवल नियंत्रकडिड चेंज सामग्री को कार्यान्वित कर रहा हूं: जो केवल [tableView reloadData] को कॉल करता है।

    इस कार्यान्वयन कि RootViewController वर्ग में शामिल है अगर आप XCode में एक नई नेविगेशन आधारित अनुप्रयोग भंडारण के लिए कोर डेटा का उपयोग करता है बनाने के लिए है। आप टेबल-एडिट एनिमेशन पर शायद कुछ नियंत्रण खो देते हैं, लेकिन यह बहुत सरल है और मेरे उद्देश्यों के लिए ठीक काम करता है।

    0

    यह एक पुराना है लेकिन एक ही समस्या वाले अन्य लोगों के लाभ के लिए, मैंने यह समझने की कोशिश करने में घंटों बिताए हैं कि अंत में क्या चल रहा था और आखिर में मेरे यादृच्छिक दुर्घटनाओं के कारण एक समस्या मिली है।

    त्रुटि संदेश भिन्न थे लेकिन अधिकतर तुलनात्मक ऑब्जेक्ट से संबंधित थे: नीचे ऑब्जेक्ट चयनकर्ता।

    - [_ NSCFSet compareObject: toObject:]: गैर मान्यता प्राप्त चयनकर्ता उदाहरण के लिए भेजा - [ _NSCFString compareObject: toObject:] गैर मान्यता प्राप्त चयनकर्ता उदाहरण के लिए भेजा

    मेरे सुझाव कोशिश करते हैं और सभी तरह वर्णनकर्ता खत्म करने के लिए है और आपके कोड से भविष्यवाणी करता है और फिर समस्या को कहां ढूंढने के लिए उन्हें एक-एक करके जोड़ता है।

    गुड लक! रोग

    1

    मैं हाल ही में एक ऐसी ही बग था - आपकी समस्या को रिहा, विशेष रूप से अधिक के साथ है:

    [sortDescriptors release]; 
    

    आप sortDescriptors

    [NSArray arrayWithObjects:sortDescriptor, nil]; 
    

    जो "alloc" नहीं है से आपत्ति प्राप्त , "प्रतिलिपि" या "नया" है, इसलिए यह एक ऑटोरेलेज्ड ऑब्जेक्ट देता है। चूंकि आप इसे जल्दी छोड़ देते हैं, आपको दो जगह मिलती हैं जहां आप क्रैश कर सकते हैं - जब NSFetchRequest इसका उपयोग करता है, और जब इसे पूल द्वारा जारी किया जाता है। अधिक जानकारी के लिए सेब के memory management guide देखें।

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