7

के साथ एक कस्टम क्लास को एन्कोड और डीकोड कैसे करें मेरे पास एक कस्टम क्लास है जिसे मैं सहेजना और लोड करना चाहता हूं। कक्षा में एनएसडीएटी, एनएसएसटींग और एनएसएनंबर शामिल हैं। मैंने .h फ़ाइल में एनएससीओडिंग प्रोटोकॉल लागू किया है। मेरे पास अब तक का कोड है। डेट एक एनएसडीएटी है। नाम एनएसएसटींग है। घर अब NSNumber है।NSKeyedArchiver

-(void)encodeWithCoder:(NSCoder *)aCoder { 
[aCoder encodeObject:theDate forKey:@"theDate"]; 
[aCoder encodeObject:theName forKey:@"theName"]; 
[aCoder encodeObject:homeAway forKey:@"homeAway"]; 
} 

-(id)initWithCoder:(NSCoder *)aDecoder { 
if ((self = [super init])) { 
    theDate = [aDecoder decodeObjectForKey:@"theDate"]; 
    theName = [aDecoder decodeObjectForKey:@"theName"]; 
    homeAway = [aDecoder decodeObjectForKey:@"homeAway"]; 
} 
return self; 
} 

मैं नीचे अपने कस्टम वस्तु लोड करने के लिए कोड का उपयोग कर रहा हूँ। जब मैं केवल डीबगर में प्रिंट-ऑब्जेक्ट का उपयोग करता हूं तो घर एक वास्तविक वस्तु के रूप में दिखाई देता है। दिनांक और नाम 0x4e4f150 मान्य वस्तु को इंगित करने के लिए प्रकट नहीं होता है।

मैं इस का उपयोग एक नया खेल (है कि मैं को बचाने के लिए कोशिश कर रहा हूँ कस्टम वर्ग) बनाने के लिए मेरी कक्षा कॉल करने के लिए:

[gamesArray setArray:[NSKeyedUnarchiver unarchiveObjectWithFile:path]]; 
Game *loadedGame = [gamesArray objectAtIndex:gameNumber]; 

मैं निम्नलिखित कोड का उपयोग कर डेटा को बचाने के। एनएसडीएटी * एडेट = [गेमडेट दिनांक] तक कोड; अप्रासंगिक है

-(void)newGame { 
if (homeAway != 0) { 
    if (dateChanged == 1) { 
     if ([nameField.text length] > 0) { 
      [homeButton setImage:[UIImage imageNamed:@"HomeGray.png"] forState:UIControlStateNormal]; 
      [awayButton setImage:[UIImage imageNamed:@"AwayGray.png"] forState:UIControlStateNormal]; 
      [dateButton setImage:[UIImage imageNamed:@"DateGray.png"] forState:UIControlStateNormal]; 
      [nameField setBackground:[UIImage imageNamed:@"textField.png"]]; 
      NSDate *aDate = [gameDate date]; 
      NSString *aString = [[[NSString alloc] initWithString:[nameField text]] autorelease]; 
      UIApplication *app = [UIApplication sharedApplication]; 
      [[[(miShotTrackAppDelegate *)[app delegate] viewController] courtViewOne] newGame:aDate withName:aString andPlace:homeAway]; 
      [loadTable reloadData]; 
      datePicke = 0; 
      homeAway = 0; 
      dateChanged = 0; 
      nameField.text = @""; 
      [self goBack]; 
      [self autoSave]; 
     } 
    } 
} 

}

कि विधि मैं newgame विधि है जो है

-(void)newGame:(NSDate *)theDate withName:(NSString *)theName andPlace:(int)homeAway { 

Game *newGame = [[Game alloc] init]; 
NSDate *tDate = [NSDate new]; 
tDate = theDate; 
[newGame setTheDate:tDate]; 
NSString *tString = [NSString stringWithString:theName]; 
[newGame setTheName:tString]; 
NSNumber *theNumber = [NSNumber numberWithInt:homeAway]; 
[newGame setHomeAway:theNumber]; 
[gamesArray addObject:newGame]; 
gameNumber = [gamesArray count] - 1; 
NSString *path = [self findGamesPath]; 
[NSKeyedArchiver archiveRootObject:gamesArray toFile:path]; 
[newGame release]; 
} 

क्यों मेरी वस्तुओं को नहीं सहेजेगा फोन से? क्या मेरी वस्तुओं की प्रतिलिपि बनाना इसके साथ कुछ करना है? मुझे टिप्पणी की गई पंक्ति पर एक त्रुटि मिलती है जो "बहुत खराब पहुंच" कहती है। कृपया मदद करें ...

उत्तर

6

आप -ititWithCoder को सही ढंग से कार्यान्वित नहीं कर रहे हैं। -decodeObjectForKey autoreleased वस्तु लौटाता है। तो जिस तरह से आपने विधि लिखा है, आप अपने सभी गेम इवार्स के लिए खतरनाक पॉइंटर्स के साथ समाप्त हो रहे हैं। बदलें -initWithCoder से:

-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if ((self = [super init])) { 
    [self setTheDate:[aDecoder decodeObjectForKey:@"theDate"]]; 
    [self setTheName:[aDecoder decodeObjectForKey:@"theName"]]; 
    [self setHomeAway:[aDecoder decodeObjectForKey:@"homeAway"]]; 
    } 
    return self; 
} 

और यह आपके लिए काम करना चाहिए।

+0

धन्यवाद ... यह काम किया !!! –

+0

इसके लिए धन्यवाद! मुझे इस पोस्ट में जोड़ना चाहिए: ** सुपर ** फ़ंक्शंस को भी कॉल करना न भूलें! यदि आप ऐसा नहीं करते हैं तो आप अजीब परिणामों के साथ समाप्त हो जाएंगे। तो: 'अगर ((स्वयं = [सुपर initWithCoder: aDecoder])) {' उपर्युक्त उदाहरण में। – Ramon