ios應用常用的數(shù)據存儲方式
- plist(XML屬性列表歸檔)
- 偏好設置NSUserDefault
- NSKeydeArchiver歸檔(存儲自定義對象)
- SQLite3(數(shù)據庫红且,關系型數(shù)據庫念祭,不能直接存儲對象,要編寫一些數(shù)據庫的語句,將對象拆開存儲)
- Core Data(對象型的數(shù)據庫,把內部環(huán)節(jié)屏蔽)
NSKeydeArchiver歸檔、NSKeyedUnarchiver解檔
@protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
@end
要想對對象進行歸檔首先必須遵守NSCoding的這兩個協(xié)議, 在實現(xiàn)這個兩個方法的時候要注意key值和類型匹配服傍,并且在類有十幾個屬性钱雷,或者更多的屬性的時候,我們需要寫多行代碼去實現(xiàn)吹零。
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>
另外可以封裝一個基類模型實現(xiàn)這兩個方法套蒂,當有需要時直接創(chuàng)建繼承基類模型的子類模型即可。