ios应用常用的数据存储方式
- plist(XML属性列表归档)
- 偏好设置NSUserDefault
- NSKeydeArchiver归档(存储自定义对象)
- SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储)
- Core Data(对象型的数据库,把内部环节屏蔽)
NSKeydeArchiver归档、NSKeyedUnarchiver解档
@protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
@end
要想对对象进行归档首先必须遵守NSCoding的这两个协议, 在实现这个两个方法的时候要注意key值和类型匹配,并且在类有十几个属性,或者更多的属性的时候,我们需要写多行代码去实现。
Objective-C运行时库提供了非常便利的方法获取其对象运行时所属类及其所有属性,并通过KVC进行值的存取,那么这里我们可以运用objc/runtime+KVC的知识完成一个自动解归档的过程。
/**
归档
*/
- (void)encodeWithCoder:(NSCoder *)aCoder
{
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (int i = 0; i < outCount; i++)
{
objc_property_t property = properties[i];
const char *name = property_getName(property);
NSString* propertyName = [NSString stringWithUTF8String:name];
[aCoder encodeObject:[self valueForKey:propertyName] forKey:propertyName];
}
}
/**
解档
*/
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init])
{
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (int i = 0; i < outCount; i++)
{
objc_property_t property = properties[i];
const char *name = property_getName(property);
NSString* propertyName = [NSString stringWithUTF8String:name];
[self setValue:[aDecoder decodeObjectForKey:propertyName] forKey:propertyName];
}
}
return self;
}
注:头文件导入 #import <objc/runtime.h>
另外可以封装一个基类模型实现这两个方法,当有需要时直接创建继承基类模型的子类模型即可。
网友评论