首页 > 移动平台 > 详细

iOS 自动归档(目前有点小问题,希望大神改一下,基本都写好了)

时间:2015-10-14 09:08:41      阅读:333      评论:0      收藏:0      [点我收藏+]
//
//  Person.m
//  自动归档
//    这是一个类文件中的实现,可以将类目提取出去,,这个文件没有问题
//  Created by 刘磊磊 on 15/10/14.
//  Copyright ? 2015年 iOS. All rights reserved.
//

#import "Person.h"
#import <objc/runtime.h>
@interface NSObject (getProperties)
- (NSDictionary *)properties_aps;
@end
@implementation NSObject(getProperties)
//属性名和属性值(引用某位大神的获取属性值的代码,再次敬礼)
- (NSDictionary *)properties_aps
{
    NSMutableDictionary *props = [NSMutableDictionary dictionary];
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    for (i = 0; i<outCount; i++)
    {
        objc_property_t property = properties[i];
        const char* char_f =property_getName(property);
        NSString *propertyName = [NSString stringWithUTF8String:char_f];
        id propertyValue = [self valueForKey:(NSString *)propertyName];
        if (propertyValue) [props setObject:propertyValue forKey:propertyName];
    }
    free(properties);
    return props;
}

- (NSArray *)getAllProperties
{
    u_int count;
    objc_property_t *properties  =class_copyPropertyList([self class], &count);
    NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count];
    for (int i = 0; i<count; i++)
    {
        const char* propertyName =property_getName(properties[i]);
        [propertiesArray addObject: [NSString stringWithUTF8String: propertyName]];
    }
    free(properties);
    return propertiesArray;
}
@end

@implementation Person

- (void)printProperty{
    NSLog(@"%@",[self properties_aps]);
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        for (NSString* pro in [self properties_aps]) {
            [self setValue:[aDecoder decodeObjectForKey:pro] forKey:pro];
        }
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder{

    NSDictionary *all = [self properties_aps];
    for (NSString *key in all.keyEnumerator) {
        [aCoder encodeObject:all[key] forKey:key];
    }
}

@end

下面是将归档和反归档封装了一下

//
//  LLLArchive.m
//  自动归档
//
//  Created by 刘磊磊 on 15/10/14.
//  Copyright ? 2015年 iOS. All rights reserved.
//

#import "LLLArchive.h"



@implementation LLLArchive

//归档是否成功  传入一个对象  以及保存的路径(需加文件名)//将对象加入到数组当中
-(BOOL)archiverWithObject:(NSDictionary *)objectsAndName andSavePath:(NSString *)path{
    NSMutableData *data = [NSMutableData data];
    for (NSString *key in objectsAndName.keyEnumerator) {
        [self.archiver encodeObject:objectsAndName[key] forKey:key];
    }
    [self.archiver finishEncoding];
     return   [data writeToFile:path atomically:YES];
}
@end
@interface  LLLUnArchive: NSObject

@end


@implementation LLLUnArchive

//反归档 dic返回的名称对应的对象   path读取的路径  对象的名称数组   类名
-(BOOL)unArchiverWithObject:(void(^)(NSMutableDictionary * dic))classBlock andSourcePath:(NSString *)path andObjectsName:(NSArray *)names andClassName:(NSString *)className{
    NSMutableDictionary *dicc = [NSMutableDictionary dictionary];
    NSData *data = [NSData dataWithContentsOfFile:path];
  NSKeyedUnarchiver*  unArchive = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

    for (NSString *string in names) {
            NSObject  *Aclass = NSClassFromString(className);
       Aclass *acb = [[Aclass alloc]init];
        acb  = [unArchive decodeObjectForKey:string];
        //此处有点小问题,就是如何根据类名创建对象
        [dicc setValue:acb forKey:string];
    }
    
    classBlock(dicc);
    if (!dicc) {
        return NO;
    }
    return YES;
}
@end


希望大家能够留言,尽快完善,谢谢







iOS 自动归档(目前有点小问题,希望大神改一下,基本都写好了)

原文:http://my.oschina.net/742865703/blog/516862

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!