2011-04-26 14 views
13

पर भेजे गए उत्परिवर्तन विधि जब मैं इस विधि का उपयोग करता हूं तो पहली बार यह ठीक काम करता है, लेकिन जब मैंने इसे दूसरी बार बुलाया तो मुझे "उत्परिवर्तनीय ऑब्जेक्ट को प्रेषित विधि" त्रुटि मिली। समस्या "addObject" कमांड के साथ है।अपरिवर्तनीय ऑब्जेक्ट

-(IBAction) save: (id) sender{ 

NSMutableArray *placesT= [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; 

if (!placesT) { 
    placesT=[[[NSMutableArray alloc] init] autorelease]; 
} 

[placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; 

NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; 
[tUD setObject:placesT forKey:@"placesT"]; 
[tUD synchronize]; 

[self dismissModalViewControllerAnimated:YES]; 

}

+0

खैर समस्या placesT आरंभीकरण के साथ है। मेरी शर्त है कि NSUserDefault मानक पहली बार खाली है और दूसरे init में जाता है। आपके पास मेमोरी लीक थर्म भी है। – Radu

+0

ध्यान दें कि आप संभवतया '[NSString stringWithFormat: @"% @ ", tagF.text]' 'tagF.text' के साथ बदल सकते हैं। '+ StringWithFormat:' भेजने की कोई आवश्यकता नहीं है, यदि 'text' पहले से ही' NSString' है। –

उत्तर

24

NSUserDefaults के लिए दस्तावेज़ के रूप में कहते हैं: "NSUserDefaults से लौटे मूल्यों अपरिवर्तनीय हैं, तो आप मूल्य के रूप में एक परिवर्तनशील वस्तु सेट करने के बावजूद।" जब भी आप एनएसयूसर डीफॉल्ट से प्राप्त संग्रह को बदलना चाहते हैं तो आपको अपरिवर्तनीय संस्करण प्राप्त करना होगा, mutableCopy बनाएं, इसे संशोधित करें, और इसे दोबारा सेट करें।

+2

इसमें जोड़ने के लिए जो उदाहरण के लिए होगा: someMutableArray = [yourArrayFromDictionary mutableCopy]; उम्मीद है कि मदद की :) – jimbob

10

ऐसा इसलिए है क्योंकि NSUserDefaults में संग्रहीत ऑब्जेक्ट mutableArray नहीं है लेकिन एक सामान्य सरणी है।

- (IBAction)save:(id)sender { 

    NSMutableArray *placesT = nil; 
    NSArray *tempArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; 

    if (tempArray) { 
     placesT = [tempArray mutableCopy]; 
    } else { 
     placesT = [[NSMutableArray alloc] init]; 
    } 

    [placesT addObject:[NSString stringWithFormat:@"%@", tagF.text]]; 

    NSUserDefaults *tUD = [NSUserDefaults standardUserDefaults]; 
    [tUD setObject:placesT forKey:@"placesT"]; 
    [tUD synchronize]; 

    [self dismissModalViewControllerAnimated:YES]; 
    [placesT release]; 
} 
+0

आप प्रतिलिपि लीक कर रहे हैं। – smorgan

+0

@ स्मोर्गन, आप बिल्कुल सही हैं। – rckoenes

3

placesT एक गैर परिवर्तनशील सरणी है, या तो हमेशा placesT एक परिवर्तनशील वस्तु हमेशा या उपयोग कोड निम्न निर्धारित किया है।

NSMutableArray *placesT= [[[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"] mutableCopy]; 
0

यह काम करना चाहिए:

- (IBAction) को बचाने: (आईडी) इस {

NSMutableArray *placesT= [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] 

objectForKey: @ "placesT"]];

if (!placesT) { 
    placesT=[[[NSMutableArray alloc] init] autorelease]; 
} 

[placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; 

NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; 
[tUD setObject:placesT forKey:@"placesT"]; 
[tUD synchronize]; 

[self dismissModalViewControllerAnimated:YES]; } 
संबंधित मुद्दे