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",区别在于""表示从当前项目路径开始寻找文件,如果找不到,则到项目中配置的头文件路径去找。<>表示直接到项目配置的头文件路径去找。
[email protected]、nonatomic、strong
在代码中会看到这几个关键词,使用@property声明变量后,Xcode4.5及之后的版本中编译器会自动生成setter和getter方法,如果不是特殊需要,可以直接使用下划线加变量名(“_name”)进行赋值取值操作。
atomic是为了防止多线程操作时同时读取数据的一种保护机制,会占用一些资源,一般在单线程中使用nonatomic即可。
strong、weak代表强弱引用(arc环境下使用,Xcode5以后默认为arc环境),使用strong申明变量为强引用类型时,意味着只要有一个指针指向该变量,它就会一直存在内存中,除非所有指向它的指针都指向其他地方或变为nil或者显式给该变量赋值为nil,它才会销毁。
使用weak则不同,比如ViewController中可以发现UI控件一般都是weak类型,编译器会自动追踪到谁拥有这个弱引用变量,当拥有者销毁时, 变量自动被赋值为nil,即View销毁后,其所属的UI控件也为nil了。
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