Objective c 当应用程序终止时,如何使用NSUserDefault保存自定义对象数组?

Objective c 当应用程序终止时,如何使用NSUserDefault保存自定义对象数组?,objective-c,ios,ios4,Objective C,Ios,Ios4,因此,我试图在应用程序终止时保存一个数组,以便在启动备份时重新填充该数组。不过,我遇到了很多不同的错误,主要是当我尝试在应用程序启动时重新创建阵列时。我已经采取步骤对自定义对象进行编码和解码,但可能我做得不正确。。。这是我的密码: - (void)applicationWillTerminate:(UIApplication *)application { /* Called when the application is about to terminate. Save data if a

因此,我试图在应用程序终止时保存一个数组,以便在启动备份时重新填充该数组。不过,我遇到了很多不同的错误,主要是当我尝试在应用程序启动时重新创建阵列时。我已经采取步骤对自定义对象进行编码和解码,但可能我做得不正确。。。这是我的密码:

- (void)applicationWillTerminate:(UIApplication *)application
{
/*
 Called when the application is about to terminate.
 Save data if appropriate.
 See also applicationDidEnterBackground:.
 */

//Here is Where I save the array. "tasks is a pre-populated array of objects

NSData *taskData = [NSKeyedArchiver archivedDataWithRootObject:tasks];
[[NSUserDefaults standardUserDefaults]setObject:taskData forKey:@"tasks"];
}

以下是“任务”数组包含的“任务”对象:

任务.h

#import <Foundation/Foundation.h>

@class TeamMember;
@class Project;


@interface Task : NSObject<NSCoding>{

NSDate *endDate;
NSDate *startDate;
NSMutableString* notes;
NSMutableString* taskName;
TeamMember *teamMember;
Project *project;
}
- (void)encodeWithCoder:(NSCoder *)encoder;
- (id)initWithCoder:(NSCoder *)decoder; 

@property  (nonatomic, retain)TeamMember *teamMember;
@property  (nonatomic, retain) Project * project;

@property (nonatomic, retain) NSMutableString *notes;
@property (nonatomic, retain) NSMutableString *taskName;
@property (nonatomic, retain) NSDate *startDate;
@property (nonatomic, retain) NSDate *endDate;


@end

忽略将这样一个数组保存到
NSUserDefaults
而不是使用CoreData是糟糕的设计这一事实,您的问题是没有同步默认值。添加此行
[[NSUserDefaults standardUserDefaults]同步]应用程序底部的code>将终止
方法

请使用CoreData。用户默认值并非用于数据持久性,而是用于存储一些小数据块,如布尔值,或需要恢复的某些特定区域的宽度和高度,而不是实际需要持久化的自定义用户内容


另外,不要使用
applicationWillTerminate
方法作为保存数据的手段,请在用户添加数据后立即保存。此方法不能保证其内容执行将正确完成。

我很感激CoreData上的信息。我以前从未使用过它,但它看起来很适合我正在尝试的工作。谢谢
#import <Foundation/Foundation.h>

@class TeamMember;
@class Project;


@interface Task : NSObject<NSCoding>{

NSDate *endDate;
NSDate *startDate;
NSMutableString* notes;
NSMutableString* taskName;
TeamMember *teamMember;
Project *project;
}
- (void)encodeWithCoder:(NSCoder *)encoder;
- (id)initWithCoder:(NSCoder *)decoder; 

@property  (nonatomic, retain)TeamMember *teamMember;
@property  (nonatomic, retain) Project * project;

@property (nonatomic, retain) NSMutableString *notes;
@property (nonatomic, retain) NSMutableString *taskName;
@property (nonatomic, retain) NSDate *startDate;
@property (nonatomic, retain) NSDate *endDate;


@end
#import "Task.h"


@implementation Task
@synthesize notes;
@synthesize taskName;
@synthesize endDate;
@synthesize startDate;
@synthesize teamMember;
@synthesize project;


//@synthesize project;
- (void)encodeWithCoder:(NSCoder *)encoder {
//Encode properties, other class variables, etc
[encoder encodeObject:self.notes forKey:@"notes"];
[encoder encodeObject:self.taskName forKey:@"taskName"];
[encoder encodeObject:self.endDate forKey:@"endDate"];
[encoder encodeObject:self.startDate forKey:@"startDate"];

//you need to add in the encoding for teammember and project
}

- (id)initWithCoder:(NSCoder *)decoder {
if((self = [super init])) {
    //decode properties, other class vars
    self.notes = [decoder decodeObjectForKey:@"notes"];
    self.taskName = [decoder decodeObjectForKey:@"taskName"];
    self.endDate = [decoder decodeObjectForKey:@"endDate"];
    self.startDate = [decoder decodeObjectForKey:@"startDate"];

    //decode teamMember and Project here

}
}



@end