2010-09-12 16 views
6

समसामयिक पाठक और पहली बार सवाल प्रश्नकर्ता है, तो कोमल हो कृपया :)रिलीज के कारण अजीब कोर डेटा त्रुटि?

मैं एक प्रबंधित वस्तु (खाता) बनाने रहा हूँ, कि जहां इसकी एक संपत्ति है कि में स्थापित किया जा रहा एक बच्चा दृश्य नियंत्रक में पारित किया जा रहा है बनाए रखा।

Account * account = [[Account alloc] initWithEntity:entity insertIntoManagedObjectContext:context]; 
AddAccountViewController *childController = [[AddAccountViewController alloc] init]; 
childController.title = @"Account Details"; 
childController.anAccount = account; 
childController.delegate = self; 

[self.navigationController pushViewController:childController animated:YES]; 
[childController release]; 
[account release]; 

दृश्य नियंत्रक इंटरफ़ेस:

@interface AddAccountViewController : UIViewController { 
} 

@property (nonatomic, retain) IBOutlet UITextField * usernameTextField; 
@property (nonatomic, retain) IBOutlet UITextField * passwordTextField; 

@property (nonatomic, retain) Account * anAccount; 
@property (nonatomic, assign) id <AddAccountDelegate> delegate; 

- (IBAction)cancel:(id)sender; 
- (IBAction)add:(id)sender; 
- (IBAction)textFieldDone:(id)sender; 
@end 

कोड नमूना 1 में तो मैं खाता वस्तु जारी किया है क्योंकि मुझे लगता है कि विधि में यह में नहीं रह गया है दिलचस्पी है। के रूप में यह AddAccountViewController द्वारा बनाए रखा है मैं में AddAccountViewController के dealloc है कि यह विज्ञप्ति एक प्रविष्टि है।

लेकिन जब मैं निम्नलिखित (बल्कि अस्पष्ट) त्रुटि के साथ ऐप्लिकेशन क्रैश ManagedObjectContext से वस्तु को नष्ट करने के लिए जाना:

Detected an attempt to call a symbol in system libraries that is not present on the iPhone: 
_Unwind_Resume called from function _PFFaultHandlerLookupRow in image CoreData. 

ज्यादा डिबगिंग & बाल के बाद खींच मुझे पता चला कि अगर मैं नहीं में खाता जारी करें AddAccountViewController की dealloc विधि ऐप ठीक से काम करता है और उपकरण के अनुसार रिसाव नहीं दिखता है।

क्या कोई भी इस बात के बारे में कोई प्रकाश डाल सकता है कि क्या हो रहा है? मैं उन गुणों पर दस्तावेज़ों से समझता हूं जिन्हें बनाए रखा जाना आवश्यक है। मुझे क्या याद आया?

अद्यतन केविन के सवाल का जवाब देने

कोड ManagedObjectContext से वस्तु को नष्ट करने के RootViewController में है (उस बच्चे नियंत्रक पकड़े)

// Override to support editing the table view. 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the managed object for the given index path 
     NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 

     [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 

     // Save the context. 
     NSError *error = nil; 
     if (![context save:&error]) { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 
} 
+0

आप कोड है कि यह NSManagedObjectContext से हटा देता है दिखा सकते हैं? और क्या यह AddAccountViewController या अन्यत्र के अंदर होता है? –

+0

'childController.anAccount = खाता; 'यह लाइन' खाता' नहीं रखती है। यह इसे 'एक्काउंट' पर कॉपी करता है। यह इसे बरकरार रखने के लिए +1 नहीं करता है, और आपको केवल 'AddAccountViewcontroller' की dealloc विधि में' aAccount' जारी करना होगा। –

+0

@ थॉमस: '@property (nonatomic, retain) खाता * एक खाता;' यह क्यों नहीं बनाएगा? – Pyetras

उत्तर

1

सबसे पहले: ऐसा लगता है ऐप्पल के हिस्से पर एक बग की तरह। कोर डेटा _Unwind_Resume पर कॉल कर रहा है, जो (शायद) कुछ प्रकार का अपवाद अनदेखा कर रहा है। फोन पर अपवाद-अनचाहे मौजूद है, लेकिन (मुझे लगता है) एआरएम एबीआई का उपयोग करता है, जो __cxa_ से शुरू होने वाले फ़ंक्शन नामों का उपयोग करता है। क्या आप सिम्युलेटर पर चल रहे हैं? एसडीके का कौन सा संस्करण?

कहीं जो "संतुलित" है जब आप [account release]; का कॉल निकालना के आसपास चल एक अतिरिक्त रिलीज हो सकती है।

"उपकरण किसी भी लीक प्रदर्शित नहीं करता है" मतलब यह नहीं है वहाँ नहीं किसी भी कर रहे हैं; आखिर में मैंने जांच की कि यह चक्रों से भ्रमित हो गया है (यानी यदि आप डीलोक में आईबीओटलेट को अन-सेट करना भूल गए हैं तो यह एक रिसाव नहीं दिखाएगा)। मैं NSMutableData * d = [NSMutableData dataWithLength:1<<20]; memcpy(d.mutableBytes, &d, 4); के साथ परीक्षण किया है, लेकिन एक आसान परीक्षण सिर्फ [[UIView alloc] initWithFrame:CGRectZero] है।

अगर आपको लगता है कि यह एक बनाए रखने/रिलीज मुद्दा है, मैं एक बार इन बनाए रखने/रिलीज/autorelease NSLog कॉल करने के लिए अधिभावी द्वारा डिबग। मैंने फिर उन सभी पर ब्रेकपॉइंट्स जोड़े, उन्हें "बीटी" कमांड चलाने के लिए सेट किया, और ऑटोकॉन्टीन्यू पर क्लिक किया। फिर, बात यह है कि टूट जाता है (मेरे मामले में मुझे लगता है कि यह सिर्फ एक अतिरिक्त बनाए रखने था) चलाने लॉग उत्पादन प्रिंट आउट, किसी व्हाइटबोर्ड पर यह छड़ी, और खर्च आधे घंटे के मिलान को बरकरार रखे हुए है और रिलीज।

+1

वास्तव में '[खाता रिलीज] को हटाकर;' पहले ब्लॉक के अंत में इसका मतलब है कि 'AddAccountViewController' में' बनाए रखना 'और' रिलीज' सही ढंग से संतुलित है और ऐप को ' ManagedObjectContext'। पहले भाग के बारे में, मैं सिम्युलेटर और डिवाइस दोनों पर कोड चला रहा था और उस त्रुटि को प्राप्त कर रहा था। एसडीके 4.1 जीएम था। – tarasis

+0

यदि '[खाता रिलीज] को हटाया जा रहा है; जैसा कि वर्णित है, इसे ठीक करता है, तो AddAccountViewController टूटा हुआ है (Obj-C स्मृति प्रबंधन सम्मेलनों के संबंध में)। AddAccountViewController के अंदर सभी कोड को देखे बिना यह कहां टूटा हुआ है, यह पता लगाना आसान नहीं है जो खाता संपत्ति या उसके बैकिंग इंस्टेंस चर को छूता है। (इसके अतिरिक्त, उपसर्ग गुण/ivars "ए" या "ए" के साथ किसी भी कोडिंग सम्मेलन में नहीं है, और उन स्थानों के विपरीत है जहां ऐप्पल इसका उपयोग करता है।) –

0

जब भी आप किसी भी प्रबंधितोबोजेक्ट को हटाते हैं, तो सिस्टम उस ऑब्जेक्ट से संबंधित सभी संदर्भ स्वचालित रूप से रिलीज़ हो जाएगा। तो प्रोग्रामिक रूप से realese ऑब्जेक्ट की कोई ज़रूरत नहीं है। एक बार जब आप ऑब्जेक्ट हटा देते हैं तो आप उस ऑब्जेक्ट को पैरेंट क्लास में एक्सेस नहीं कर सकते हैं।

+1

यह सच नहीं है। जब एक प्रबंधित ऑब्जेक्ट हटा दिया जाता है तो इसे हटाने के लिए फ़्लैग किया जाता है लेकिन यह स्मृति को रिलीज़ नहीं कर सकता क्योंकि यह सेब मेमोरी प्रबंधन नीति का उल्लंघन करता है। –

+0

मैं एनएसएमएनेज्ड ऑब्जेक्ट कॉन्टेक्स्ट क्लास का अध्ययन करता हूं, मैंने पाया कि जब हटाएं ऑब्जेक्ट विधि कहा जाता है, ऑब्जेक्ट को अनन्य टेबल से निकाल दिया जाएगा। –

1

मैं ने वही समस्या एक में समाप्त होने के लिए किया था "प्रणाली पुस्तकालयों में एक प्रतीक है कि iPhone पर मौजूद नहीं है फोन करने की कोशिश का पता चला: _Unwind_Resume छवि CoreData में समारोह _PFFaultHandlerLookupRow से कहा जाता है।" त्रुटि संदेश।

मेरी समस्या मॉडल में एक संबंध पर गलत "कैस्केडिंग" हटाना-नियम था। इस नियम के साथ, मेरी शीर्ष प्रबंधित ऑब्जेक्ट हटा दी गई लेकिन अभी भी कोड में संदर्भित किया गया है। "nulify" के इस संबंध पर "नियम हटाएं" सेट करने के बाद, सबकुछ डिज़ाइन के रूप में काम करता है।

-> कोई मूल डेटा समस्या नहीं ... डिज़ाइन समस्या!

जॉनी