文档章节

iOS 自动归档

 石头2017
发布于 2015/10/14 02:20
字数 465
阅读 167
收藏 2
//
//  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) {
    
       Class clazz = [NSClassFromString(className) alloc]init];
        acb  = [unArchive decodeObjectForKey:string];
        [dicc setValue:acb forKey:string];
    }
    
    classBlock(dicc);
    if (!dicc) {
        return NO;
    }
    return YES;
}
@end


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







© 著作权归作者所有

粉丝 0
博文 7
码字总数 2240
作品 0
德州
私信 提问
加载中

评论(1)

石头2017 博主
不错
浅谈iOS开发中的对象归档

iOS提供的数据持久化方式有:SQLiteCoreData属性列表、NSUserDefault对象归档。 这里来简单介绍下iOS开发中的对象归档: 对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化...

泊菜
2014/11/27
4K
8
Xcode5 + phoneGap2.9搭建ios开发环境-配置-测试-归档上传/phoneG...

前言: 小弟是做JAVA/Android的第一次搞这个ios,公司有mobile项目是使用phoneGap开发的,需要开发ios版本.什么都不会只能一点一点琢磨了……大神越过…… 原文链接:http://my.oschina.net/j...

郏高阳
2013/10/14
20.4K
9
iOS应用存储数据的常用的方式之plist和归档

iOS应用创建的数据存储方式 plist文件,是XML属性的列表形式 归档(遵循协议) SQLite(需要自己写sql语句) Core Data 苹果对的一个封装 今天我们先来说说文件,需要知道一个概念 沙盒文件 每一个...

追逐iOS
04/20
0
0
用 Ruby 开发 iOS 应用 —— RubyMotion

RubyMotion是一个商业应用,基于开源的 MacRuby, 让你可以使用 Ruby 语言来开发 iOS 应用程序! RubyMotion 应用的创建和后期维护都是采用终端命令行方式,一个 RubyMotion 项目是基于 Rake...

红薯
2012/05/04
7.2K
16
iOS 8 正式版发布!有史以来极其重大的 iOS 版本

苹果正式发布了 iOS 8 正式版。iPhone 4s 或更新设备,iPad 2 或更新设备以及第五代 iPod touch 或 iPad mini 可以升级至 iOS 8。用户可以通过设置应用中的通用——软件更新完成升级。iOS 8...

oschina
2014/09/18
5.1K
25

没有更多内容

加载失败,请刷新页面

加载更多

采坑指南——k8s域名解析coredns问题排查过程

正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一个nginx服务 apiV...

码农实战
2分钟前
1
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第6题

choose three Which three statements are true about indexes and their administration in an Orade database? A) An INVISIBLE index is not maintained when Data Manipulation Language......

oschina_5359
5分钟前
1
0
阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。...

阿里巴巴云原生
10分钟前
1
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

xiangyunyan
13分钟前
3
0
js 让textarea的高度自适应父元素的高度

textarea按照普通元素设置height是没有作用的,可以这么来设置, 下面给上一段项目代码 JS代码: $.fn.extend({ txtaAutoHeight: function () { return this.each(function () {...

文文1
13分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部