1.MVC
Model:模型
描述程序是什么,例如数据库操作之类的行文以及纸牌Demo里纸牌玩法都是写在Model这一层,通过Notification和KVO(后续文章会介绍)两种方式与Controller通讯。
Controller:控制层
程序的逻辑在这里组织,Controller负责Model与View之间的沟通,因为Model与View老死不相往来。
当用户在页面进行操作后,Controller收集用户发出的交互信息,然后请教Model如何应对,Model收到Controller提出的问题,再给出答案(Controller不提出问题,Model永远不会主动回答)。Controller收集到Model给出的回应之后,再根据情况去更新UI页面。
当把UI控件与Controller联系起来时,Controller中会出现对应控件的outlet接口,通过它,Controller可以直接对UI控件进行通讯。
View:UI页面
程序运行后,用户看到的就是这一层,用户的交互信息可以通过delegate、dataSource和Target-Action三种方式与Controller进行通讯。
以纸牌Demo为例,右侧即程序运行后的页面,即View层,
左侧列表Model中一系列文件为Model层,定义了纸牌游戏的一系列玩法,如何玩。
CardgameViewController就是Controller层了,收集到页面点击的信息,找到Model里的方法,再去更新页面效果。
MVC的好处就在于代码分离,不仅使代码结构更清晰,也方便后续迭代更新,尤其是Controller中代码一多,可避免在Controller这一层与UI元素设置纠缠在一起。
如图,纸牌Demo中建立Model层以后,能够使代码更简洁清晰(注释掉的为分离Model前使用的部分代码)。
2.h文件和.m文件
Objective-c中.h文件主要用来声明公共接口,包括声明类及其方法。.m文件则负责具体实现,也可以在这定义不想暴露出去的私有接口。
引入头文件时会看到两种写法,引用系统自带的一般用#import <XX.h>,引用自定义的一般用#import "XX.h",区别在于""表示从当前项目路径开始寻找文件,如果找不到,则到项目中配置的头文件路径去找。<>表示直接到项目配置的头文件路径去找。
3.@property、nonatomic、strong
在代码中会看到这几个关键词,使用@property声明变量后,Xcode4.5及之后的版本中编译器会自动生成setter和getter方法,如果不是特殊需要,可以直接使用下划线加变量名(“_name”)进行赋值取值操作。
atomic是为了防止多线程操作时同时读取数据的一种保护机制,会占用一些资源,一般在单线程中使用nonatomic即可。
strong、weak代表强弱引用(arc环境下使用,Xcode5以后默认为arc环境)。
使用strong申明变量为强引用类型时,意味着变量是对象的拥有者,除非将该变量(Objective-C中所有变量都是指针)赋值为nil或者指向其他对象,不然该对象会一直存在内存中,即对象只要有至少一个拥有者(strong变量)时,就不会被销毁。
需要注意的是,Xcode中,不指明strong或weak时,默认为strong,但即使是strong,@property中一般也会指明strong,这是一种约定俗成习惯,虽然不写也没错。
使用weak则不同,意味着该变量不是对象的拥有者。比如在ViewController中可以发现UI控件一般都是weak类型,当View这个拥有者销毁后,UI控件就没有拥有者了,自动被赋值为nil,即View销毁后,其所属的UI控件也不存在了。
4.iOS7新特性 instancetype
课程中建议init方法使用instancetype代替id,当返回值与消息接收者类型一致时就可以用instancetype,能够让编译器自动做一些检查工作,在我们写代码编译阶段就能自动检查返回值类型是否合法,但instancetype不能像id一样作为参数使用,暂不深入研究,有兴趣可以参考
http://blog.eddie.com.tw/2013/12/16/id-and-instancetype/
5.课程中用到的纸牌Demo最终效果
源码见附件:http://files.cnblogs.com/colinhou/Matchismo.zip