基于runtimexiede归档存储处理.直接项目就能用.只需要改成自己相应需要存储的属性名字即可
///邀请码
@property (nonatomic, copy) NSString *inviteCode;
///邀请注册
@property (nonatomic, copy) NSString *inviteFriend;
///已邀请人数
@property (nonatomic, copy) NSString *invitedNum;
///手机号
@property (nonatomic, copy) NSString *mobile;
/**
* 创建用户信息模型
*
* @param infors 登录时需要将登录成功的获取的数据传递过来, 其余时候可以传值nil
*
* @return 返回创建的用户信息对象
*/
+ (YHXUserModle *)shareYHXUserModleWithInfors:(NSMutableDictionary *)infors;
/**
* 更改时信息时,更新用户信息--!!!没有做更改时:禁止调用
*
* @param userModle 将需要归档的对象传递
*/
- (void)yhxUpdateUserInforsWithUser:(YHXUserModle *)userModle;
/**
* 退出登录时删除用户信息--!!!非退出登录操作:禁止调用
*/
+ (void)yhxDeleteUserInfors;
具体实现:
#import "YHXUserModle.h"
#import <objc/runtime.h>
#define FILEPATH [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingString:@"/us.a"]
@implementation YHXUserModle
#pragma mark updateInfor
- (void)yhxUpdateUserInforsWithUser:(YHXUserModle *)userModle {
NSFileManager *maneger = [NSFileManager defaultManager];
if ([maneger fileExistsAtPath:FILEPATH]) {
[maneger removeItemAtPath:FILEPATH error:nil];
}
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:userModle forKey:@"user"];
[archiver finishEncoding];
BOOL success = [data writeToFile:FILEPATH atomically:YES];
if (success) {
NSLog(@"archiver Success");
}else {
NSLog(@"archiver Failed");
}
}
+ (void)yhxDeleteUserInfors {
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:FILEPATH error:nil];
if (success ) {
NSLog(@"clean Success");
}else {
NSLog(@"clean Failed");
}
}
#pragma mark unArchiver archiver
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
unsigned count = 0;
Ivar *ivarList = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivarList[i];
NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
NSString *key = [name substringFromIndex:1];
id value = [aDecoder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
free(ivarList);
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
unsigned count = 0;
Ivar *ivarList = class_copyIvarList([self class], &count);
for (int i = 0 ; i < count; i ++) {
Ivar ivar = ivarList[i];
NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
NSString *key = [name substringFromIndex:1];
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key];
}
free(ivarList);
}
#pragma mark creat Modle
+ (YHXUserModle *)shareYHXUserModleWithInfors:(NSMutableDictionary *)infors{
if ([[NSFileManager defaultManager] fileExistsAtPath:FILEPATH]) {
NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:FILEPATH];
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
YHXUserModle *modle = [unArchiver decodeObjectForKey:@"user"];
return modle;
}else {
YHXUserModle *modle = [[self alloc] init];
unsigned count = 0;
Ivar *ivarList = class_copyIvarList([self class], &count);
#pragma mark 只进行二级封装, 不再进行三级封装
for (int i = 0; i < count; i ++) {
Ivar ivar = ivarList[i];
NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
NSString *key =[name substringFromIndex:1];
id value = [infors objectForKey:key];
NSString *ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
if ([value isKindOfClass:[NSDictionary class]] && ![ivarType containsString:@"NS"]) {
ivarType = [ivarType stringByReplacingOccurrencesOfString:@"@\"" withString:@""];
ivarType = [ivarType stringByReplacingOccurrencesOfString:@"\"" withString:@""];
Class modleClass = NSClassFromString(ivarType);
value = [modleClass shareYHXUserModleWithInfors:value];
}
[modle setValue:value forKey:key];
}
free(ivarList);
return modle;
}
}
@end