博客> 自定义类的归档和解档
自定义类的归档和解档
1小时前 评论:0 阅读:803 pinglan_z
ios

自定义了一个类ItemData,类中包含若干字符串,int型变量,float型变量等。想要实现的功能为:用NSkeyedArchiver可以归档类对象,也可以从磁盘解档类对象,而且当有多个ItemData时,需要能够追加归档和解档。 关键点包括:

  1. ItemData需要实现NSCoding代理 @interface ItemData : NSObject

  2. 需要手动实现代理中的两个方法: -(void)encodeWithCoder:(NSCoder *)aCoder -(nullable instancetype)initWithCoder:(NSCoder *)aDecoder 第一个方法在归档的时候用,第二个方法在从磁盘解档时用。需要注意的是,调用 第二个方法时,相当于初始化一个类对象,因此,一定要在方法内首先调用父类的init函数: self = [super init];
  3. 归档使用的方法是 [NSKeyedArchiver archiveRootObject:object toFile:FilePath];
  4. 解档使用的方法是 ItemData* data =[NSKeyedUnarchiver unarchiveObjectWithFile:itemsFilePath];

  5. 可以一次性归档或解档一个ItemData数组,但不能是NSMutableArray,只能是NSArray。 实际实验时,用NSMutableArray归档后解档的数组,里面的数据值不正确,因此,在归档或者解档前, 应该将NSMutableArray转成NSArray NSMutableArray muArray转成NSArray的方法是: `NSArray array = [muArray copy]; 反过来 NSMutableArray* muArray = [array mutableCopy]`

  6. 想要追加着归档文件,需要在归档一个对象前,把磁盘上的文件中 所有对象解档到一个NSMutableArray中,然后在数组中追加一个对象,重新归档。

  7. 归档到设备的什么位置 //获取设备Document的位置(具体SandBox的文件夹种类以及itunes同步相关可参见网上很多文章) NSArray* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString* docPath = [path objectAtIndex:0]; //具体的文件名称,stringByAppendingPathComponent的意义,我的理解是加了个/ itemsFilePath = [docPath stringByAppendingPathComponent:@"RemindItems.dat"]; //用NSFileManager判断文件是否存在,如果不存在,则创建 NSFileManager *fileManager = [NSFileManager defaultManager]; if (![fileManager fileExistsAtPath:itemsFilePath]) { [fileManager createFileAtPath:itemsFilePath contents:nil attributes:nil];

    }

收藏
2
sina weixin mail 回到顶部