起初接触的轻量级 物理存储 方式 是 plist  可以存储 系统级别的 字典 数组   但是不能存储自定义的对象类

那会 用自定义对象做存储的 需求也不大 主要 是 还没建立面向对象意识,会的也少. 再就是真的需要存储 自定义类时候 就用了CoreData了

今天 就把落下的补上   NSCoding 轻量级 建立自定义类  存储 读写 等 常用操作

使用 NSCoding  必须遵循 <NSCoding>协议  必须实现两个方法 一个编码 一个解码 initWithCoder 是解码 

//属性编码方法

- (void)encodeWithCoder:(NSCoder *)aCoder;

//属性解码方法

- (id)initWithCoder:(NSCoder *)aDecoder;

调用 + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;会启动属性编码 

调用 + (nullable id)unarchiveObjectWithFile:(NSString *)path; 会启动属性解码 

不建议存在.txt文件里面  因为我用命令行 去打开模拟器里面 这个文件时候 提示"未能打开文稿"xxx.txt". 该文件格式不正确"

但是 可以解档. 直接把那个文件改为 .plist 文件 也可以打开,数据也在里面.

所以 我觉得直接存成.plist文件好了.

具体使用:

#import <UIKit/UIKit.h>

@interface HFMusicModel : NSObject<NSCoding> //遵守 NSCoding 协议

@property (nonatomic, strong) NSString * img_url;
@property (nonatomic, strong) NSString * amount;
@property (nonatomic, strong) NSString * time;
@property (nonatomic, strong) NSString * title;
@property (nonatomic, strong) NSString * url;
@property (nonatomic, strong) NSString * method_id; @end
#import "HFMusicModel.h" @implementation HFMusicModel /**
* 必须要实现的两个方法 解码 和 编码
*/ //将属性进行编码 "保存 归档" - (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.img_url forKey:@"img_url"];
[aCoder encodeObject:self.amount forKey:@"amount"];
[aCoder encodeObject:self.time forKey:@"time"];
[aCoder encodeObject:self.title forKey:@"title"];
[aCoder encodeObject:self.url forKey:@"url"];
[aCoder encodeObject:self.method_id forKey:@"method_id"];
} //将属性进行解码 "加载 读取 解档" - (id)initWithCoder:(NSCoder *)aDecoder //该方法也是一种 初始化
{
self = [super init];
if (self) {//注意不产生死循环
self.url = [aDecoder decodeObjectForKey:@"img_url"];
self.amount = [aDecoder decodeObjectForKey:@"amount"];
self.time = [aDecoder decodeObjectForKey:@"time"];
self.title = [aDecoder decodeObjectForKey:@"title"];
self.url = [aDecoder decodeObjectForKey:@"url"];
self.method_id = [aDecoder decodeObjectForKey:@"method_id"];
}
return self;
}

调用

    HFMusicModel *musicModel = [[HFMusicModel alloc]init];
musicModel.img_url = @"http://h.hiphotos.baidu.com/baike/pic/item/a686c9177f3e67092e15a66d3bc79f3df8dc550f.jpg";
musicModel.amount = @"1024";
musicModel.time = @"60";
musicModel.title = @"我是歌曲名称";
musicModel.method_id = @"0"; //数据写入文件
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *path = [[NSString alloc] initWithFormat:@"%@%@",bundlePath,@"/musiclist.plist"]; BOOL isSaved = [NSKeyedArchiver archiveRootObject:musicModel toFile:path];
NSLog(@"%@",[NSNumber numberWithBool:isSaved]); //读文件数据
HFMusicModel *tempMusicModel;
tempMusicModel = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"%@\n%@\n%@\n%@",tempMusicModel.title,tempMusicModel.amount,tempMusicModel.img_url,tempMusicModel.time);

也可以直接作为model 转成 NSData 存在 轻量级plist里面

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:tempMusicModel] forKey:@"musicList"];
tempMusicModel = nil;
tempMusicModel = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults]objectForKey:@"musicList"]];
NSLog(@"%@\n%@\n%@\n%@",tempMusicModel.title,tempMusicModel.amount,tempMusicModel.img_url,tempMusicModel.time);
[NSUserDefaults standardUserDefaults] //存储路径 [NSUserDefaults standardUserDefaults]  存储地址在

/data/Containers/Data/Application/7490CC6B-04E8-453A-B400-CAD1202498B3/Library/Preferences/XXX.plist
 
[[NSBundle mainBundle] bundlePath]
//存储路径   /data/Containers/Bundle/Application/02E7AE6B-7DF7-485D-8DE6-35952D895C65/LiqunNSCodingDemo.app/musiclist.plist

iOS NSCoding 的学习 和 使用的更多相关文章

  1. iOS开发如何学习前端(2)

    iOS开发如何学习前端(2) 上一篇成果如下. 实现的效果如下. 实现了一个横放的<ul>,也既iOS中的UITableView. 实现了当鼠标移动到列表中的某一个<li>,也 ...

  2. iOS开发如何学习前端(1)

    iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...

  3. 移动开发iOS&Android对比学习--异步处理

    在移动开发里很多时候需要用到异步处理.Android的主线程如果等待超过一定时间的时候直接出现ANR(对不熟悉Android的朋友这里需要解释一下什么叫ANR.ANR就是Application Not ...

  4. 关于iOS开发的学习

    关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...

  5. iOS核心动画学习整理

    最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...

  6. iOS CoreData技术学习资源汇总

    一.CoreData学习指引 1. 苹果官方:Core Data Programming Guide 什么是CoreData? 创建托管对象模型 初始化Core Data堆栈 提取对象 创建和修改自定 ...

  7. IOS内存管理学习笔记

    内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...

  8. 关于 iOS 的一些学习资料

    iOS.Book.Effective Objective-C 2.0 1. 中文翻译版 (更新中) https://github.com/HagerHu/effective-objective-c-2 ...

  9. ios之runtime学习

    今天学习了一下ios的runtime,看了其他博主的博客写的很不错,自己就不班门弄斧了,仅在此转载: 1.关于oc中类和元类:http://husbandman.diandian.com/post/2 ...

随机推荐

  1. eclipse 断点类别

    行断点 行断点位于一般方法内,双击代码行左边就可以设置行断点: 行断点可以设置条件,右键断点-properties: 1设置效果是第几次到达时暂停,图中所示是当第三次到达时暂停 2是开启条件断点 3是 ...

  2. 【问题记录】eclipse启动web项目时,spring会初始化两次

    背景:一个tomcat,一个eclipse,一个SSM框架的web项目.在eclipse中新建tomcat服务器,默认配置,然后在服务器配置中将Server Locations改成Use Tomcat ...

  3. UIWebView加上safari风格前进后退按钮(转)

    今天在写程序内打开网页的功能,写工具条的时候发现系统图标里面竟然没有后退按钮,,由于我这个是静态库工程,不可能自己弄张图上去,不然使用本库的时候还得附上图片,经过一下午的搜索,终于找到个比较靠谱的,这 ...

  4. Windows 7 SP1和Windows Server 2008 SP1的Event ID 10错误的解决方法

    安装了Windows 7 Service Pack 1 (SP1) 或 Windows Server 2008 R2 Service Pack 1 (SP1)都会遇到此错误提示. "Even ...

  5. 使用MyBatis_Generator生成Dto、Dao、Mapping

    由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,所以查资料发现有现成的工具可以自动生成底层模型类.Dao接口类甚至Mappi ...

  6. Android Studio 使用笔记: 重命名和重构

    重命名 选中一个变量名称,菜单才是可用状态.然后可以根据系统给出的建议或者自己重新定义变量名称. 快捷键:Shift + F6 (Windows和Mac都是一样的) 重构 选中需要重构的代码,可以按照 ...

  7. thinkphp5中的一些关于命名空间的tisp

    1.thinkphp5中公共函数文件common中,不需要use,也可以直接使用vendor中的类文件. 2.在类前面的反斜杠作用是,直接使用最外层的命名空间,有时不想use某个X类,却想使用X类时, ...

  8. 更新换代----systemctl命令取代chkconfig和service

    systemctl命令是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 ...

  9. vmware workstation 9.0.2安装教程

    现在为您分享最新的VMware Workstation 9.0正式版(VMware Workstation 9.0.0 Build 812388)的下载,同时附上注册机或者注册激活码. 下载地址:   ...

  10. java 通过Apache poi导出excel代码demo实例

    package com.zuidaima.excel.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutput ...