如何保存数组中的自定义对象,并将其存储在NSUserDefaults – iPhone中

button操作方法后,我得到我的自定义类对象。 现在我需要在NSMutableArray存储多个自定义对象,然后将这个数组存储在NSUserDefaults

这是我的代码:

 -(IBAction)onClickSubmitLater:(id)sender { //Saving store in user defaults for later upload data. NSMutableArray *arrayStoreList = [[NSMutableArray alloc] init]; arrayStoreList = [Util getArrayPreference:@"Store"];//arrayStoreList is the list of all stores. Store *store = [[Store alloc] init]; store = [arrayStoreList objectAtIndex:self.selectedStoreIndex];//here i am getting particular store that i need to save in array. //archive NSData *dataStore = [NSKeyedArchiver archivedDataWithRootObject:store]; [[NSUserDefaults standardUserDefaults] setObject:dataStore forKey:@"resultStore"]; //unarchive NSData *dataResultStore = [[NSUserDefaults standardUserDefaults] objectForKey:@"resultStore"]; Store *resultStore = (Store *)[NSKeyedUnarchiver unarchiveObjectWithData:dataResultStore]; NSLog(@"%@", resultStore); } 

使用上面的代码,它将单个自定义类Store对象StoreNSUserDefaults 。 所以我想在提交后面的ibaction后把所有Store对象保存在NSMutableArray 。 后来,我将一个一个的取得服务器上传商店的arrays。

谢谢。

要以用户默认值存储和检索具有自定义对象的数组,可以使用以下方法:

 -(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray]; [defaults setObject:data forKey:keyName]; [defaults synchronize]; } -(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *data = [defaults objectForKey:keyName]; NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data]; [defaults synchronize]; return myArray; } 

但要确保你已经实施

 - (void) encodeWithCoder : (NSCoder *)encode ; - (id) initWithCoder : (NSCoder *)decode; 

在数据模型类中避免崩溃的方法如下:

 - (void)encodeWithCoder:(NSCoder *)coder; { [coder encodeObject:label forKey:@"label"]; [coder encodeInteger:numberID forKey:@"numberID"]; } - (id)initWithCoder:(NSCoder *)coder; { self = [super init]; if (self != nil) { label = [[coder decodeObjectForKey:@"label"] retain]; numberID = [[coder decodeIntegerForKey:@"numberID"] retain]; } return self; } 

您需要通过实施NSCoding协议将其归档。 然后你可以把它写入任何文件。

在你的模型中实现这些方法:

 - (void) encodeWithCoder : (NSCoder *)encode ; - (id) initWithCoder : (NSCoder *)decode; 

正如你所说,你已经在类中实现了这个,现在你需要保存这个数组。

为了保存和读取数组,你需要使用:;

 [[NSUserDefaults standardUserDefaults] setObject:yourMutableArray forKey:@"keyForArray"]; NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"keyForArray"]]; 

这两个方法将主要用于storeretrieve自定义对象的属性。

 - (void)encodeWithCoder:(NSCoder *)encoder ; - (id)initWithCoder:(NSCoder *)decoder; 

看看@ chrissr的回答 ,@Brad Larson的回答