如何在iOS中保存一个充满自定义类的数组?

在我为学校项目创建的iOS应用程序中,我无法保存存储在NSMutableArray中的数据。该数组在app委托文件中创建,然后在各种其他视图控制器文件中创建它的委托。存储在数组中的数据由NSStrings和NSNumbers组成的自定义类组成。 我已经在这个网站上阅读并关注了大约一个星期的例子,但我不能为我的生活弄明白。我也研究了核心数据,但是我无法弄清楚如何在没有完全重新开始的情况下实现它,并且不幸的是我很紧张。 我尝试过的事情: 在WillTerminate方法中存档。 (activityArray是我的数组)
- (void)applicationWillTerminate:(UIApplication *)application {
NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString* arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"];
[NSKeyedArchiver archiveRootObject:activityArray toFile:arrayFile];
[activityArray release];
然后在AppDelegate文件的didFinishLaunchingWithOptions方法中取消归档
    NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"];
if ([fileManager fileExistsAtPath:arrayFile]) {
    NSLog(@"yes");
    activityArray = [NSMutableArray arrayWithContentsOfFile:arrayFile];
} else {
    activityArray = [[NSMutableArray alloc] init];
}
根据其他问题的建议,我在自定义类中执行了以下操作(此类有2个NSStrings,activityName和activityDescription)。
- initWithCoder:(NSCoder *)aCoder {
self = [super init];
activityName = [[aCoder decodeObjectForKey:@"activityName"] retain];
activityDescription = [[aCoder decodeObjectForKey:@"activityDescription"] retain];
return self;
 }

-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:activityName forKey:@"activityName"];
[aCoder encodeObject:activityDescription forKey:@"activityDescription"];
}
但这似乎都不适合我。感谢任何帮助。我觉得这应该是一件相当容易的事,但我似乎无法得到它。     
已邀请:
核心数据实际上非常简单且快速实施。几个月前,我发了一篇关于快速设置它的博客文章。只需使实体代表您创建的不同类,或者自己添加@dynamic属性。 请记住,Core Data的行为与Array相同,因为只能存储对象。因此,您需要将NSNumber用于int floats等。     
您可以使用NSUserDefaults保存您的阵列,如下所示:
NSData *theData =  [NSKeyedArchiver archivedDataWithRootObject:activityArray];
[[NSUserDefaults standardUserDefaults] setObject:theData forKey:@"myArray"];
然后,您可以检索保存对象,如下所示:
NSData *theData = [[NSUserDefaults standardUserDefaults] dataForKey:@"myArray"];
NSArray *activityArray = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:theData];
但是,为了实现这一点,您必须为所提到的任何自定义对象实现initWithCoder和encodeWithCoder方法。     
您是否真的检查过您的归档代码是否已执行?在启用了多任务处理的iOS 4下,几乎从不调用
applicationWillTerminate:
。您应该考虑将代码放在
applicationDidEnterBackground:
中。 至于在归档后释放阵列,当用户离开应用程序时它会失败(它将被暂停)然后又回来(应用程序刚刚重新激活,而不是重新启动)。在这种情况下,您释放阵列的事实将导致您的应用程序崩溃。     

要回复问题请先登录注册