一、那么首先,咱们就从这个结果来分析 1.就不给大家一步一步分析了,直接分析我们这里怎么想的, 首先,我们看到这样的一个界面,我们想,这些应用数据是不是来源于一个plist文件吧, 所以说,我们首先要,第一步,要懒加载,把这个plist文件中的数据,加载起来, 那么,因为,我们打开这个plist文件,这个plist文件中的每一条数据,就是一个字典, 我们要用模型来保存数据,所以说,首先是不是要根据字典,去创建一个模型, 那么,所以说,我们首先,就先创建这么一个模型,TestApp, 这个模型中有多少个属性,取决于你当前这个字典中有多少个键值对, 这个字典中是不是有两个键值对吧,一个是name,一个是icon, 都是字符串类型,所以说,这个模型当中,就建两个属性, 然后呢,建模型的时候,为了方便后面的使用,为了保证封装,所以说,这个模型当中,要创建两个方法, 一个是对象方法:initWithDict, 一个是类方法:appWithDict, 这两个方法的实现,大家看怎么实现的, 在这个initWithDict里面,首先,调一下父类的init方法,是不是先把对象从父类中继承下来的那些成员,先初始化一下吧,初始化完毕以后,接下来,再把这个对象扩展的新的这两个属性,用字典中这两个键值对的值,是不是来初始化, 初始化完毕以后,return self,返回当前对象, 然后,在这个类方法中,直接调这个类的alloc initWithDict,这样的话,这个模型,是不是就写好了, 这里要提醒大家注意的就是:这个模型中的这两个方法,在封装的时候,返回值要使用什么,instancetype, 这个instancetype,表示什么含义,还记得吗, 它在哪个类中,就表示当前这个类型的指针, 它在TestApp这个类中,就表示TestApp类型的指针, 就表示TestApp *,就表示这个指针, 当它在子类里面,就表示子类的指针, 也就是说,instancetype,在哪个类里面,就表示哪个类型的指针, instancetype和id的区别: 1)id这个类型,可以作为方法的返回值、可以作为方法的参数、可以用id设置一个属性、也可以用id设置一个局部变量, 它就好比是一个NSObject *,是一个万能指针, 但是,我们这个instancetype不一样,instancetype,只能作为方法的返回值,instancetype这个关键字,只能作为方法的返回值, 其他地方用它,一定报错 2.第二步,我们现在说的是最终版,我们现在思考这个问题,怎么思考,一开始,看到这个数据是plist数据, 1)所以首先就是,要加载,要加载就是懒加载, 2)加载的时候,发现里面有字典,就要根据字典建立模型,因为等会儿我们用的,一定是模型吧,所以说,先把模型建好,刚才咱们说的就是建模型, 3)模型建好以后,接下来,就开始编写懒加载的代码, 懒加载的代码,怎么来写,就在我们控制器里面,控制器里面,首先 1> 在控制器里面,我们可以设置一个NSArray数组,为什么这里设了个NSArray,不是NSDictionary,因为整体来看,这个plist文件,是一个什么类型,NSArray类型吧, 所以我们这里要用NSArray类型来作为它的属性类型, 然后,懒加载代码怎么写,就是重写这个属性的getter方法, 在这个属性的getter方法里面,判断,如果是nil的话,是不是做我们的懒加载, 懒加载的步骤就是: 1>> 首先,把那个字典数组读取进来, 2>> 然后,循环这个数组中的每一个字典, 3>> 每一个字典,对应的创建一个模型, 4>> 然后呢,把字典对象传进去, 5>> 在这个模型内部,根据这个字典,创建模型,并且给模型的属性赋值, 6>> 创建好模型以后,把这个模型加到arrayModels这个可变数组当中, 7>> 循环完以后,把这个arrayModels可变数组,赋值给_apps这个属性, 8>> 执行完这个if语句以后,我们这个_apps数组中,就有数据了,并且,这个apps数组中每一个元素,就是一个模型, 好,