2011-08-26 9 views
9

मेरे पास कुछ कोर डेटा कार्यक्षमता है जो कुछ हालिया (प्रतीत होता है कि असंबद्ध) परिवर्तन किए जाने तक ठीक काम कर रहा था। अब मुझे समस्याएं आ रही हैं जहां किसी विशेष NSManagedObject सबक्लास उदाहरण से संबंधित सभी गुण अचानक शून्य लौट रहे हैं।कोर डेटा विशेषता शून्य में बदलती है (एआरसी संबंधित?)

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

@implementation Foo (Debug) 

- (void)setValue:(NSDate *)value 
{ 
    [self willChangeValueForKey:@"value"]; 
    [self setPrimitiveValue:value forKey:@"value"];  
    [self didChangeValueForKey:@"value"]; 
} 

- (NSDate *)value 
{ 
    [self willAccessValueForKey:@"value"]; 
    NSDate *value = [self primitiveValueForKey:@"value"]; 
    [self didAccessValueForKey:@"value"]; 

    return value; 
} 

@end 

setValue: मेरे वस्तु के लिए कहा जाता है और दिया गया तर्क एक गैर शून्य NSDate है। फिर मान पुनर्प्राप्त किया जाता है (किसी अन्य विधि में)। निर्दिष्ट किया गया वही मान सही ढंग से पुनर्प्राप्त किया गया है।

हालांकि जब कोई अन्य विधि मान पढ़ने की कोशिश करती है, तो मूल्य एक्सेसर को कॉल किया जाता है और शून्य मूल्य को primitiveValueForKey द्वारा वापस किया जाता है:।

दोनों के बीच में सेट पढ़ा गया है: कॉल नहीं किया गया है और फू ऑब्जेक्ट स्वयं अभी भी मान्य है (गैर-शून्य)। वास्तव में किसी भी कोर डेटा ऑब्जेक्ट या संपूर्ण संदर्भ में दोनों पढ़ने के बीच कोई अन्य कोर डेटा ऑपरेशन नहीं किया जाता है।

हम अपने प्रोजेक्ट में एआरसी का उपयोग कर रहे हैं। क्या यह संभव है कि एआरसी किसी भी तरह से मेरे कोर डेटा चर के साथ गड़बड़ कर रहा है और उन्हें हटा रहा है? यदि ऐसा है तो क्या किसी के पास एआरसी विध्वंस डीबग करने के लिए कोई सुझाव है? या बेहतर अभी तक, क्या कोई यह सुनिश्चित करने का तरीका जानता है कि एआरसी मेरे चर को निष्क्रिय नहीं करता है।

यह एआरसी से भी संबंधित नहीं हो सकता है, हालांकि मुझे क्या हो रहा है इसके बारे में कुछ नुकसान हुआ है। किन्हीं भी सुझावों को स्वीकार किया जाएगा।

+0

एआरसी अभी भी एनडीए के तहत है, इसलिए हम ऐप्पल के प्रतिबंधित मंचों के बाहर इसकी चर्चा नहीं कर सकते हैं। – TechZen

+8

[एआरसी एनडीए के तहत नहीं है।] (Http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-June/015588.html) –

+0

कोई भी मौका आप दो अलग-अलग धागे पर दो अलग-अलग धागे पर काम कर रहे हैं वस्तु की प्रतियां? अन्यथा, क्या आप वाकई एक ही वस्तु है? क्या आप दो नहीं बना रहे हैं? या आपने अपना संदर्भ रीसेट नहीं किया है या अन्यथा आपके परिवर्तनों को बीच में खो दिया है? –

उत्तर

11

यह बहुत संभावना है क्योंकि NSManagedObjectContext कि इन वस्तुओं से संबंधित बंद हो रहा है काम करता है। जब आपके पास NSManagedObject आस-पास के उदाहरण हैं लेकिन आप स्वयं को संदर्भ में नहीं रखते हैं, तो उन प्रबंधित ऑब्जेक्ट्स nil लौटाना शुरू कर देंगे।

एआरसी के तहत, सुनिश्चित करें कि आप संदर्भ को strong चर में संग्रहीत करते हैं, यानी एक उदाहरण चर जो weak या static वैश्विक नहीं है।

गैर-एआरसी, यानी रिटाइन-रिलीज कोड, सुनिश्चित करें कि आप संदर्भ को बनाए रखते हैं।

+0

क्या कोई जानता है कि ऐसा क्यों होता है? मुझे एक ही समस्या थी और केवल अपने स्वयं के प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट चर का उपयोग करके इसे हल कर सकता था। लेकिन यह कष्टप्रद है और एक बग की तरह लगता है। – lindinax

+0

आपको ** संदर्भ पर पकड़ने के लिए ** की आवश्यकता है। यह एक बग नहीं है। प्रबंधित ऑब्जेक्ट संदर्भ कोर डेटा के अधिकांश काम करता है। यदि आपके पास कोई संदर्भ नहीं है, तो प्रबंधित वस्तुओं को पता नहीं है कि किसके साथ बातचीत करना है। –

+0

एक ivar 'NSManagedObjectContext * mContext' का उपयोग करना नौकरी नहीं करेगा? – lindinax

0

जांच viewDidLoad-विधि

profile = [NSEntityDescription insertNewObjectForEntityForName:@"MyProfile" inManagedObjectContext:profileContext]; 

आशा है कि यह

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

  • कोई संबंधित समस्या नहीं^_^