iOS NSCoding 的学习 和 使用

 起初接触的轻量级 物理存储 方式 是 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文件好了.

具体使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#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;
}

 调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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里面

1
2
3
4
[[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);

 

1
[NSUserDefaults standardUserDefaults] //存储路径 [NSUserDefaults standardUserDefaults]  存储地址在/data/Containers/Data/Application/7490CC6B-04E8-453A-B400-CAD1202498B3/Library/Preferences/XXX.plist
1
<em id="__mceDel"> </em>
1
[[NSBundle mainBundle] bundlePath]
1
//存储路径   /data/Containers/Bundle/Application/02E7AE6B-7DF7-485D-8DE6-35952D895C65/LiqunNSCodingDemo.app/musiclist.plist

 

posted on   ACM_Someone like you  阅读(1115)  评论(0编辑  收藏  举报

编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示