Objective-C数据保存和读取

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Objective-C数据保存和读取相关的知识,希望对你有一定的参考价值。

一、NSCoding协议中的Archiving和Unarchiving

(1)Archiving一个object,会记录这个对象的所有的properties到filesystem;

(2)Unarchiving一个object,会从data中重新创建这个object。

类中的实力要Archiving和Unarchiving,需遵守NSCoding协议,并要实现以下两个方法:

@protocol NSCoding
-(void)encodeWithCoder:(NSCoder*)aCoder;
-(instancetype)initWithCoder:(NSCoder*)aCoder;
@end

例:

//
-(void)encodeWithCoder:(NSCoder*)aCoder{
    [aCoder encodeObject:self.itemName forKey:@"itemName"];
    [aCoder encodeInt:self.valueInDollars forKey:@"valueInDollars"];
}

//
-(instancetype)initWithCoder:(NSCoder*)aCoder{
   self = [super init];
   if(self){
        _itemName = [aDecoder decodeObjectForKey:@"itemName"];
        _valueInDollars = [aDecoder decodeIntForKey:@"valueInDollars"];  
    }
   return self;  
}

类似地,

XIB file被保存,即是把views  archived  into XIB file;

当应用程序启动时,从XIB file里unarchive the views。

二、使用NSCoder的子类在sandbox中存取

应用程序的sandbox是一个目录,包括:Documents、Library(不会在应用程序退出时删除)、tmp(会在应用程序退出时删除)。

NSCoder的子类,这里指:NSKeyedArchiver和NSKeyedUnArchiver这两个类。

例:

//生成file path
-(NSString *)itemArchivePath {
  NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
  NSString *documentDirectory = [documentDirectories firstObject];
   return [ documentDirectory stringByAppendingPathComponent:@"items.archive"];
}

//
-(BOOL)saveChanges {
   NSString *path = [self itemArchivePath];
    return [NSKeyedArchiver archiveRootObject:XXX toFile:path];
}

//
-(instancetype)initPrivate {
   self = [super init];
   if(self){
       NSString *path = [self itemArchivePath];
       _privateItem = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
  }
  return self;
}
NSKeyedArchiver存对象的过程分为两步:(1)先调用encodeWithCoder来encode变量到NSKeyedArchiver;(2)再存到path。
三、用NSData写入FileSystem
例:
-(NSString*)imagePathForKey:(NSString*)key{
    NSArray *documentDirectories =....;
    NSString *documentDirectory = ...;
    return [  documentDirectory stringByAppendingPathComponent:key];
}

//写入
NSString imagePath = [self imagePathForKey:key];
NSData *data = UIImageJPEGRepresentation(image,0.5);
[data writeToFile:imagePath atomically:YES];

//删除
[[NSFileManager defaultManager] removeItemAtPath:imagePath error:nil];

//读取
UIImage *image = [UIImage imageWithContentOfFile:imagePath];
其中NSFileManager可以获取、创建、拷贝以及移动文件和目录。
 

 

以上是关于Objective-C数据保存和读取的主要内容,如果未能解决你的问题,请参考以下文章

如何将这个 Objective-C 代码片段写入 Swift?

iOS/Objective-C:在后台线程中保存到核心数据

如何在 Objective-C iOs 8 上将 ParseObject 存储在本地数据存储和 Parse Cloud 中?

Objective-C三方库: ZXEasyCoding

在 Objective-C 中使用 JSON 数据的 NSJSONSerialization 读取 NSDictionary 集的键值

Objective-C 保存和加载文件