1.从plist文件加载数据
2.获取plist文件,转为数组
@property (nonatomic , strong) NSArray *appList;
// 懒加载属性
-(NSArray *)appList
{
// 将字典转为模型
if(_appList == nil){
// _appList = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil]];
NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil]];
// 创建临时数组
NSMutableArray *arrayM = [NSMutableArray array];
for(NSDictionary *dict in array){
hdAppInfo *appInfo = [hdAppInfo appInfoWithDict:dict];
[arrayM addObject:appInfo];
}
// 将临时数组为属性赋值
_appList = arrayM;
}
return _appList;
}
3.字典转模型的好处:
(1)降低代码的耦合度
(2)所有字典转模型部分的代码统一集中在一处处理,降低代码出错的几率
(3)在程序中直接使用模型的属性操作,提高编码效率
(4)调用方不用关心模型内部的任何处理细节
4.字典转模型的注意点:
4.1声明属性 :
@property (nonatomic , copy)NSString *name;
@property (nonatomic , copy)NSString *icon;
// 4.2 instancetype 主要用于在类方法实例化对象,让编译器主动推断对象的实际类型
/** 通常在写模型的实例化方法时,以下两个方法,都需要实现 */
模型应该提供一个可以传入字典参数的构造方法
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)xxxWithDict:(NSDictionary *)dict;
提示:在模型中合理地使用只读属性,可以进一步降低代码的耦合度。
4.3构造方法实现
/** 使用字典实例化模型 */
-(instancetype) initWithDict:(NSDictionary *)dict
{
// self是对象
self = [super init];
if (self) {
// 用字典给属性赋值,所有与plist键值有关的方法,均在此处!
self.name = dict[@"name"];
self.icon = dict[@"icon"];
}
return self;
}
// 类方法可以快速实例化一个对象
+(instancetype) appInfoWithDict:(NSDictionary *)dict
{
// self是 class
return [[self alloc]initWithDict:dict];
}
5.补充说明
5.1.readonly属性
(1)@property中readonly表示不允许修改对象的指针地址,但是可以修改对象的属性值。
(2)通常使用@property关键字定义属性时,会生成getter&setter方法,还会生成一个带下划线的成员变量。
(3)如果是readonly属性,只会生成getter方法,不会生成带下划线的成员变量.
5.2.instancetype类型
(1)instancetype会让编译器检查实例化对象的准确类型
(2)instancetype只能用于返回类型,不能当做参数使用
5.3.instancetype & id的比较
(1) instancetype在类型表示上,跟id一样,可以表示任何对象类型
(2) instancetype只能用在返回值类型上,不能像id一样用在参数类型上
(3) instancetype比id多一个好处:编译器会检测instancetype的真实类型