iOS边练边学--plist文件,懒加载,模型初使用--补充instancetype
2016-03-05 22:36
671 查看
一、什么是plist文件
1>将数据直接写在代码里面,不是一种合理的做法。如果数据经常修改,就要经常翻开对应的代码进行修改,造成代码扩展性低
2>因此,可以考虑将经常变得数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码
3>一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种“属性列表文件”的扩展名是plist,因此也成为“plist文件”
二、创建plist文件
三、解析plist文件
代码实例:
四、plist文件的使用注意
1>plist的文件名不能叫做"info"、"Info"之类的
2>添加plist等文件资源的时候,一定要勾选下面的选项
如果遇到忘了勾选的情况,可以用一下方式解决
五、懒加载
1>为什么用到懒加载
加载plist等文件数据,加载数据用懒加载,如果一上来就将所有数据都加载,第一影像程序性能,第二,加载的数据本次操作不一定能用上,浪费内存--懒加载的本质就是重写getter方法,也就是使用数据的时候才进行加载!
2>代码实例--之前是在viewDidLoad方法中获取的数据,不管用不用到都要加载。以下方法是在用到时再加载
@property (strong, nonatomic) NSArray *things; // 重写get方法,实现懒加载
六、模型--模型取代字典
1>模型的本质就是直接继承NSObject的类文件
2>字典转模型的过程最好封装在模型内部,模型中的属性对应字典的哪个key值,模型说的算,外部不要干涉,外部只管调用模型的构造方法获取模型
3>模型应该提供一个可以传入字典参数的构造方法,一个类方法,一个对象方法
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)xxxWithDict:(NSDictionary *)dict;
4>代码实例:
模型的声明部分:
模型的实现部分:
5>懒加载+模型
之前的懒加载代码,得到的数据是字典的集合,下面的代码是在懒加载的过程中实现了字典转换模型
七、补充instancetype
1>instancetype在类型表示上,跟id一样,可以表示任何对象类型
2>instancetype只能用在返回值类型上,不能像id一样用在参数类型上
3>instancetype比id多一个好处:编译器会检测instancetype的真实类型
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之GCD再谈(dispatch_group,dispatch_semaphore)
- Xcode插件安装与管理
- iOS 引导页面的做法 第一运行出现 以后运行不在出现
- iOS边练边学--定时任务和HUD
- iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?
- ios 动态添加了按钮,绑定同一个点击事件,如何判断点击的是哪个?
- 【Xamarin挖墙脚系列:IOS-关于手机支持的屏幕方向】
- 谈谈iOS开发中的frame、bounds和center
- iOS开发中给图片添加高斯模糊效果
- 如何发布自己的开源框架到CocoaPods
- iOS--链式编程
- iOS Runloop学习
- iOS URLencode加号变空格
- iOS第三方库的一些总结
- iOS 开发--NSMutableArray使用枚举方法
- iOS自定义导航栏titleView
- iOS 获取当前IP地址
- IOS 之copy(浅拷贝)和mutableCopy(深拷贝) 以及strong 和weak理解
- IOS开发中的几种设计模式
- iOS开发之字符串搜索包含