写入和读取自定义对象到文件IOS

我有这个对象。

@interface SeccionItem : NSObject <NSCoding> { NSString * title; NSString * texto; NSArray * images; } @property (nonatomic,strong) NSString * title; @property (nonatomic,strong) NSString * texto; @property (nonatomic,strong) NSArray * images; @end 

有了这个实现

 @implementation SeccionItem @synthesize title,texto,images; - (void) encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:title forKey:@"title"]; [encoder encodeObject:texto forKey:@"texto"]; [encoder encodeObject:images forKey:@"images"]; } - (id)initWithCoder:(NSCoder *)decoder { title = [decoder decodeObjectForKey:@"title"]; texto = [decoder decodeObjectForKey:@"texto"]; images = [decoder decodeObjectForKey:@"images"]; return self; } @end 

我想将填充了这个对象的数组保存到磁盘上的一个文件中。

我做这个:

来写

 [NSKeyedArchiver archiveRootObject:arr toFile:file]; 

读书

 NSArray *entries = [NSKeyedUnarchiver unarchiveObjectWithFile:name]; return entries; 

但是,阵营总是空的,我不知道为什么,我有一些问题。

我应该使用什么格式的文件path? 上toFile:?

对象的NSArray充满了NSData对象,所以我可以编码它们?

我真的失去了这一点。

看看NSKeyedArchiver的文档,尤其是archiveWithRootObject:toFile:方法。

path基本上是文件应存储在哪里,包括文件名。 例如,您可以将数组存储在您的应用程序Documents文件夹中,名称为Storage 。 下面的代码片段很常见:

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDir = [paths objectAtIndex: 0]; NSString* docFile = [docDir stringByAppendingPathComponent: @"Storage"]; 

使用NSSearchPathForDirectoriesInDomains方法代替绝对path,因为Apple可以根据需要更改“文档”文件夹path。

您可以使用上面的docFilestring将其提供给archiveWithRootObject:toFile:方法的toFile参数。

使用以下方法保存数据

 -(NSString*)saveFilePath { NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *pathString = [[pathArray objectAtIndex:0] stringByAppendingPathComponent:@"data"]; //NSString *pathString = [[NSBundle mainBundle]pathForResource:@"Profile" ofType:@"plist"]; return pathString; } -(void)saveProfile { SeccionItem *data = [[SeccionItem alloc]init] data. title = @"title"; data. texto = @"fdgdf"; data.images = [NSArray arrayWithObjects:@"dfds", nil]; NSMutableData *pData = [[NSMutableData alloc]init]; NSString *path = [self saveFilePath]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:pData]; [data encodeWithCoder:archiver]; [archiver finishEncoding]; [pData writeToFile:path atomically:YES]; } 

使用以下方法加载数据

 -(void)loadData { NSString* path = [self saveFilePath]; //NSLog(path); NSMutableData *pData = [[NSMutableData alloc]initWithContentsOfFile:path]; NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:pData]; data = [[SeccionItem alloc]initWithCoder:unArchiver]; //NSLog(@"%@",data.firstName); [unArchiver finishDecoding]; }