NSMutableArray addObject ऑब्जेक्ट के रिलीज के बाद शून्य पर सेट हो रहा है

मैंने NSMutableArray * arrAllRecordsM घोषित कर दिया है और NOutject को addObject का उपयोग करके इसमें जोड़ने का प्रयास कर रहा हूं। dicRecordM को arrAllRecordsM में जोड़ा जाता है लेकिन [dicRecordM removeAllObjects] करने पर यह arrAllRecordsM में शून्य हो जाता है। नीचे कोड है, कृपया इसे ठीक करने में मेरी सहायता करें।

self.arrAllRecordsM = [NSMutableArray array];
self.dicRecordM = [NSMutableDictionary dictionary];

// कुछ विधि

[self.dicRecordM setObject:@"Test" forKey:@"ADDRESS"];
[self.arrAllRecordsM addObject:self.dicRecordM];

// Value: Test
NSLog(@"Value: %@", [[self.arrAllRecordsM objectAtIndex:0] valueForKey:@"ADDRESS"]);
[self.dicRecordM removeAllObjects];

// Value: null
NSLog(@"Value: %@", [[self.arrAllRecordsM objectAtIndex:0] valueForKey:@"ADDRESS"]); 
0
आपका कोड सही तरीके से व्यवहार कर रहा है। आप एक अलग परिणाम की उम्मीद क्यों करते हैं? आप एक nonexistent मान प्राप्त करने की कोशिश कर रहे हैं। बेशक यह शून्य वापस करने जा रहा है।
जोड़ा लेखक rmaddy, स्रोत

2 उत्तर

किसी ऑब्जेक्ट को NSMutableArray में जोड़ना बस एक सूचक (या "मजबूत संदर्भ") संग्रहीत करता है सरणी में वस्तु के लिए। इसलिये

[self.arrAllRecordsM objectAtIndex:0]

तथा

self.dicRecordM

एक ही ऑब्जेक्ट के दो पॉइंटर्स हैं। यदि आप self.dicRecordM से सभी कुंजी/मान जोड़े हटाते हैं तो [self.arrAllRecordsM objectAtIndex: 0] अभी भी वही इंगित करता है (अब खाली) शब्दकोश। यही कारण है कि

[[self.arrAllRecordsM objectAtIndex:0] valueForKey:@"ADDRESS"]

शून्य देता है।

यदि आप सरणी में शब्दकोश की एक स्वतंत्र प्रतिलिपि चाहते हैं, तो उपयोग करें

[self.arrAllRecordsM addObject:[self.dicRecordM copy]];

copy can be used on many classes, such as NSDictionary, NSArray तथा NSString तथा their mutable variants, to get a "functionally independent object". Formally, it is available for all classes conforming to the NSCopying protocol.

0
जोड़ा

यह व्यवहार की उम्मीद है। आपने removeAllObjects को कॉल करके शब्दकोश से सभी ऑब्जेक्ट्स को हटा दिया है, फिर उस ऑब्जेक्ट को पुनर्प्राप्त करने का प्रयास किया है और सही ढंग से nil प्राप्त कर रहा है, क्योंकि यह अब डिक्शनरी में मौजूद नहीं है ( आपने इसे हटा दिया)।

आपके लिए शायद अस्पष्ट यह है कि NSArray उस तत्व को कॉपी नहीं करता है जिसे आप इसमें जोड़ते हैं, इसके बजाय यह केवल एक मजबूत संदर्भ रखता है।

तो dicRecordM और arrAllRecordsM दोनों समान ऑब्जेक्ट का संदर्भ रखते हैं, इसलिए इसमें कोई संशोधन (इस मामले में removeAllObjects </कोड>) एक ही शब्दकोश को प्रभावित करेगा।


संयोग से, आपको शब्दकोश की प्रविष्टियों तक पहुंचने के लिए valueForKey: का उपयोग नहीं करना चाहिए। objectForKey: या छोटा सबस्क्रिप्ट सिंटैक्स का उपयोग करें। उदाहरण के लिए

self.arrAllRecordsM[0][@"ADDRESS"]

आप इस उत्तर को ऑब्जेक्टफोरकी और वैल्यू फॉरकी के बीच अंतर संदर्भ के रूप में पढ़ सकते हैं, लेकिन मुख्य समस्या यह है कि valueForKey: objectForKey: से बहुत अलग व्यवहार कर सकता है यदि कुंजी में विशेष केवीसी वर्ण होते हैं, जैसे कि @ या

0
जोड़ा