问题描述
我有一个希望保存和加载的自定义类.该类包含一个NSDate,一个NSString和一个NSNumber.我已经在.h文件中实现了NSCoding协议.这是我到目前为止的代码. theDate是一个NSDate. theName是NSString. homeAway是NSNumber.
I have a custom class that I wish to save and load. The class contains an NSDate, an NSString, and an NSNumber. I have implemented the NSCoding protocol in the .h file. Here is the code I have so far. theDate is an NSDate. theName is the NSString. homeAway is the NSNumber.
-(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;
}
我正在使用下面的代码加载我的自定义对象.当我在调试器中使用print-object时,只有homeAway会显示为实际对象. theDate和theName说0x4e4f150似乎没有指向有效的对象.
I am using the code below to load my custom object. When I use print-object in the Debugger only the homeAway shows up as an actual object. theDate and theName say 0x4e4f150 does not appear to point to a valid object.
[gamesArray setArray:[NSKeyedUnarchiver unarchiveObjectWithFile:path]];
Game *loadedGame = [gamesArray objectAtIndex:gameNumber];
我使用以下代码保存数据:
I save the data using the following code:
我用它来调用我的班级来创建一个新的游戏(我要保存的自定义班级).直到NSDate * aDate = [gameDate date]的代码;是无关紧要的.
I use this to call my class to create a new Game (the custom class that I am trying to save). The code up to NSDate *aDate = [gameDate date]; is irrelevant.
-(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方法
From that method I call the newGame method which is
-(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];
}
为什么我的对象无法保存?复制对象是否与此有关?我确实在注释行上看到"exc bad access"错误.请帮忙...
Why will my objects not save? Does copying my objects have something to do with it? I do get an error on the commented line that says "exc bad access". Please help...
推荐答案
您没有正确实现-initWithCoder. -decodeObjectForKey返回自动释放的对象.因此,编写该方法的方式将导致所有Game ivars的指针悬空.将-initWithCoder更改为:
You're not implementing -initWithCoder correctly. -decodeObjectForKey returns autoreleased object. So the way you wrote the method, you're ending up with dangling pointers for all of your Game ivars. Change -initWithCoder to:
-(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;
}
它应该为您工作.
这篇关于如何使用NSKeyedArchiver编码和解码自定义类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!