一、什么是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>模型应该提供一个可以传入字典参数的构造方法,一个类方法,一个对象方法

  - (instancetype)initWithDict:(NSDictionary *)dict;
  + (instancetype)xxxWithDict:(NSDictionary *)dict;
4>代码实例:
  模型的声明部分:
 //  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的更多相关文章

  1. iOS开发基础-图片切换(4)之懒加载

    延续:iOS开发基础-图片切换(3),对(3)里面的代码用懒加载进行改善. 一.懒加载基本内容 懒加载(延迟加载):即在需要的时候才加载,修改属性的 getter 方法. 注意:懒加载时一定要先判断该 ...

  2. iOS开发基础-图片切换(2)之懒加载

    延续:iOS开发基础-图片切换(1),对(1)里面的代码进行改善. 在 ViewController 类中添加新的数组属性:  @property (nonatomic, strong) NSArra ...

  3. iOS边练边学--xib文件初使用

    一.Xib和storyboard对比 *共同点: 1>都用来描述软件界面 2>都用Interface Builder工具来编辑 3>本质都是转换成代码去创建控件 *不同点 1> ...

  4. iOS Interface Builder:在.xib文件中加载另一个.xib文件

    在开发中,经常会用到一个需要重复使用的模块,比如好友列表中每个用户的展示或每条动态,这些都是相同的模版,这样我们就可以把这个部分提取出来放到一个单独的.xib中.那么提取出的.xib如何在其他.xib ...

  5. [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例

    懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...

  6. iOS 懒加载模式

    感谢: chengfang iOS开发-懒加载 1.懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否 ...

  7. ios 懒加载详解

    iOS开发之懒加载 在iOS开发中几乎经常用到懒加载技术,比如我们存放网络数据的数组,控制器的view,控件的自定义,复杂的运算逻辑等等情况下都会用到懒加载技术,那么什么是懒加载呢?? 他又有什么样的 ...

  8. 懒加载--初步理解. by:王朋

    懒加载(LazyLoad),又称为延迟加载. 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动 ...

  9. angular配置懒加载路由的思路

    前言 本人记性不好,对于别人很容易记住的事情,我愣是记不住,所以还是靠烂笔头来帮我长长记性. 参考文章:https://blog.csdn.net/xif3681/article/details/84 ...

随机推荐

  1. 解决修改计算机名后tfs连接不上的错误

    1,用vs 自带的工具命令 tf workspaces 查看集合 2,执行命令: >tf workspaces /collection:https://aaaa.visualstudio.com ...

  2. 修改jQuery.validate验证方法和提示信息

    1.添加验证方法 在jquery.validate.js文件中直接添加验证方法,例如: jQuery.validator.addMethod("Specialstring", fu ...

  3. c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

    //求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...

  4. puppeteer (Nodejs版selenium )快速入门

    官网 https://pptr.dev/ api 与 教程: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.mdhttp ...

  5. Spring里的FactoryBean和BeanFactory有啥区别?

    分别看这俩文章就知道了 Spring的FactoryBean使用 Spring加载xml配置文件的方式 ApplicationContext

  6. Oracle中查询表字段基本信息、主键、外键(整理)

    背景 因为项目某些模块的数据结构设计没有严格按照某规范设计,所以只能从数据库中查询数据结构,需要查询的信息如下:字段名称.数据类型.是否为空.默认值.主键.外键等等. 在网上搜索了查询上述信息的方法, ...

  7. php读取sqlite数据库入门实例

    php读取sqlite数据库的例子,php编程中操作sqlite入门实例.原文参考:http://www.jbxue.com/article/php/22383.html在使用SQLite前,要确保p ...

  8. verilog中的default应该赋什么样的值

    Q:在状态机的case语句中,最后要加上默认项default,可是我看到有的书上写的是一个确定的状态,有的则是不定态xxx,到底应该写那个啊?求助! A1:取决于case条件是否完备啦如果你的case ...

  9. 黑客编程教程(二)Win API编程简介

    第二节 Win API编程简介 下面介绍一下WIN API. 我们需要自己编写一个工具时,必然会用到很多操作windows和控制windows的函数,这些函数就是windows API. API是Ap ...

  10. 【RapidIO相关】DSP与FPGA通信

    TI参考链接: http://www.ti.com.cn/general/cn/docs/gencontent.tsp?contentId=50741 ------------------------ ...