iOS边练边学--plist文件,懒加载,模型初使用--补充instancetype
一、什么是plist文件
1>将数据直接写在代码里面,不是一种合理的做法。如果数据经常修改,就要经常翻开对应的代码进行修改,造成代码扩展性低
2>因此,可以考虑将经常变得数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码
3>一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种“属性列表文件”的扩展名是plist,因此也成为“plist文件”
二、创建plist文件

三、解析plist文件
代码实例:
// 一个NSBundle对象对应一个资源包(图片、音频、视频、plis等文件)
// NSBundle的作用:用来访问与之对应的资源包内部的文件,可以用来获得文件的全路径
// 项目中添加的资源都会被添加到主资源包中
// [NSBundle mainBundle]关联的就是项目的主资源包
NSBundle *bundle = [NSBundle mainBundle];
NSString *file = [bundle pathForResource:@"things" ofType:@"plist"];
self.things = [NSArray arrayWithContentsOfFile:file];
四、plist文件的使用注意
1>plist的文件名不能叫做"info"、"Info"之类的
2>添加plist等文件资源的时候,一定要勾选下面的选项

如果遇到忘了勾选的情况,可以用一下方式解决

五、懒加载
1>为什么用到懒加载
加载plist等文件数据,加载数据用懒加载,如果一上来就将所有数据都加载,第一影像程序性能,第二,加载的数据本次操作不一定能用上,浪费内存--懒加载的本质就是重写getter方法,也就是使用数据的时候才进行加载!
2>代码实例--之前是在viewDidLoad方法中获取的数据,不管用不用到都要加载。以下方法是在用到时再加载
@property (strong, nonatomic) NSArray *things; // 重写get方法,实现懒加载
// 重写things的get方法,实现懒加载
- (NSArray *)things
{
if (_things == NULL) {
// 加载主资源包
NSBundle *bundle = [NSBundle mainBundle];
// 通过主资源包获取things.plist的全路径
NSString *file = [bundle pathForResource:@"things" ofType:@"plist"];
// 通过全路径获取数据
_things = [NSArray arrayWithContentsOfFile:file];
}
return _things;
}
六、模型--模型取代字典
1>模型的本质就是直接继承NSObject的类文件
2>字典转模型的过程最好封装在模型内部,模型中的属性对应字典的哪个key值,模型说的算,外部不要干涉,外部只管调用模型的构造方法获取模型
3>模型应该提供一个可以传入字典参数的构造方法,一个类方法,一个对象方法
// ShopModel.h
// UIView练习
//
// Created by admin on 16/3/5.
// Copyright © 2016年 admin. All rights reserved.
// 商品模型 #import <Foundation/Foundation.h> @interface ShopModel : NSObject
/** 商品名称 */
@property(nonatomic,strong) NSString *name;
/** 商品图片 */
@property(nonatomic,strong) NSString *icon; - (instancetype)initWithDic:(NSDictionary *)dic;
+ (instancetype)shopModelWithDic:(NSDictionary *)dic;
@end
模型的实现部分:
// ShopModel.m
// UIView练习
//
// Created by admin on 16/3/5.
// Copyright © 2016年 admin. All rights reserved.
// #import "ShopModel.h" @implementation ShopModel - (instancetype)initWithDic:(NSDictionary *)dic
{
if (self = [super init])
{
self.name = dic[@"name"];
self.icon = dic[@"icon"];
}
return self;
} +(instancetype)shopModelWithDic:(NSDictionary *)dic
{
return [[self alloc] initWithDic:dic];
}
@end
5>懒加载+模型
之前的懒加载代码,得到的数据是字典的集合,下面的代码是在懒加载的过程中实现了字典转换模型
// 重写things的get方法,实现懒加载
- (NSArray *)things
{
if (_things == NULL) {
// 加载主资源包
NSBundle *bundle = [NSBundle mainBundle];
// 通过主资源包获取things.plist的全路径
NSString *file = [bundle pathForResource:@"things" ofType:@"plist"];
// 通过全路径获取数据
_things = [NSArray arrayWithContentsOfFile:file]; // 思路:数据的get方法,直接返回模型的集合,遍历字典数组,将字典的数据在懒加载过程中都转化成模型数据
NSMutableArray *arrTemp = [NSMutableArray array]; // 定义可变数组
for (NSDictionary *dic in _things) {
[arrTemp addObject:[ShopModel shopModelWithDic:dic]];
}
_things = arrTemp; // 将装有的模型集合赋值给成员变量
}
return _things;
}
七、补充instancetype
1>instancetype在类型表示上,跟id一样,可以表示任何对象类型
2>instancetype只能用在返回值类型上,不能像id一样用在参数类型上
3>instancetype比id多一个好处:编译器会检测instancetype的真实类型
iOS边练边学--plist文件,懒加载,模型初使用--补充instancetype的更多相关文章
- iOS开发基础-图片切换(4)之懒加载
延续:iOS开发基础-图片切换(3),对(3)里面的代码用懒加载进行改善. 一.懒加载基本内容 懒加载(延迟加载):即在需要的时候才加载,修改属性的 getter 方法. 注意:懒加载时一定要先判断该 ...
- iOS开发基础-图片切换(2)之懒加载
延续:iOS开发基础-图片切换(1),对(1)里面的代码进行改善. 在 ViewController 类中添加新的数组属性: @property (nonatomic, strong) NSArra ...
- iOS边练边学--xib文件初使用
一.Xib和storyboard对比 *共同点: 1>都用来描述软件界面 2>都用Interface Builder工具来编辑 3>本质都是转换成代码去创建控件 *不同点 1> ...
- iOS Interface Builder:在.xib文件中加载另一个.xib文件
在开发中,经常会用到一个需要重复使用的模块,比如好友列表中每个用户的展示或每条动态,这些都是相同的模版,这样我们就可以把这个部分提取出来放到一个单独的.xib中.那么提取出的.xib如何在其他.xib ...
- [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例
懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...
- iOS 懒加载模式
感谢: chengfang iOS开发-懒加载 1.懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否 ...
- ios 懒加载详解
iOS开发之懒加载 在iOS开发中几乎经常用到懒加载技术,比如我们存放网络数据的数组,控制器的view,控件的自定义,复杂的运算逻辑等等情况下都会用到懒加载技术,那么什么是懒加载呢?? 他又有什么样的 ...
- 懒加载--初步理解. by:王朋
懒加载(LazyLoad),又称为延迟加载. 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动 ...
- angular配置懒加载路由的思路
前言 本人记性不好,对于别人很容易记住的事情,我愣是记不住,所以还是靠烂笔头来帮我长长记性. 参考文章:https://blog.csdn.net/xif3681/article/details/84 ...
随机推荐
- iOS拦截导航栏返回按钮事件的正确方式
当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...
- jmeter --- 基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示
转自:https://blog.csdn.net/RickyOne_RR/article/details/50637839 本文主要讲述如何利用JMeter监听器Backend Listener,配合 ...
- Linux内核同步 - RCU基础
一.前言 关于RCU的文档包括两份,一份讲基本的原理(也就是本文了),一份讲linux kernel中的实现.第二章描述了为何有RCU这种同步机制,特别是在cpu core数目不断递增的今天,一个性能 ...
- 让thinkphp 支持ftp上传到远程,ftp删除
让thinkphp真正的支持FTP上传.删除. 原创by default7#zbphp.com,如需转载请保留作者信息. /** * This is not a free software, All ...
- Sunisoft.IrisSkin.SkinEngine 设置winform皮肤
Sunisoft.IrisSkin.SkinEngine se; se = new Sunisoft.IrisSkin.SkinEngine { SkinAllForm = true, SkinFil ...
- gulp#4.0
gitbook教程: https://dragon8github.gitbooks.io/gulp-webpack/content/an-zhuang-gulp-4-0.html gulpfile.j ...
- introduction to python for statistics,analysis笔记3
一.产生数组和矩阵 1.linspace(start,end,number),产生在start和end数之间number个数 >>> x = linspace(, , ) >& ...
- 创建C3P0数据源
[Author]: kwu 创建C3P0数据源,实际开发中直接用JDBC连接数据库是非常少的.一般使用数据源的形式,C3P0是开源的数据源,实际项目用得非常多: 1.添加maven的支持 <de ...
- IE下JS读取xml文件示例代码
JS读取xml文件具体步骤为:创建DOM对象.加载xml文件(仅适用于IE)附示例代码,感兴趣的朋友可以参考下,希望对大家有所帮助使用javascript脚本读取xml文件,这里暂只考虑IE浏览器st ...
- linux工具大全
Linux Performance hi-res: observability + static + perf-tools/bcc (svg)slides: observabilityslides: ...