网易公开课上可以看,听课的好处在于,它的节奏比较快,你要适应这个节奏,就会查阅相关用到的知识,这个过程中,就掌握了很多东西。
我会把每节课的笔记都整理成博文,主要的目的还是备忘。还有一点就是,在csdn上看到了容芳志写得关于这个课程的专栏,很受启发。容芳志的专栏地址如下:
http://blog.csdn.net/column/details/stanford-ios.html
一 课程简介
这是斯坦福大学2011年下半学期的课程,老师的名字是Paul Hegarty. 这个老头相当严厉,从他对作业的要求就可以看得出来。 Paul Hegarty毕业于斯坦福大学,有在apple的工作经历,从他的讲课时的编程功底也能看得出。技术无关的话题不多说了,有兴趣的可以去网易公开课看看。
二 IOS架构
主要分为四层,从下往上分别是core OS, core Services, Media, Cocoa touch.
1 core OS
系统最底层,都是基于C的unix下的api, 主要提供诸如安全, 文件系统等基础服务. 这一层离我们开发上层应用有些遥远,想了解更深入,可以看看unix操作系统相关的资料.
2 core service
这一层提供的功能和上面有些重叠,不过它是基于对象的架构了,比如像socket, 多线程,数据库,集合等操作,都是用面向对象的API提供,这一层提供的服务已经开始充斥在我们的代码的各个角落里了.
3 media
这一层就不多说了,很明显,图像,视频,动画,游戏相关的API,类都是这里提供的.
4 cooca touch
这一层可以理解为你在开发过程中,能直观的马上感受的东西,比如一个view里面的按钮,提示框,触摸,位置布局等.
三 关于MVC
先上一幅图,再慢慢详述。这个图相当给力,你试一下在网上搜索ios MVC, 很多资料里都可以看到引用了这个图,我相信这个图最初的源头,正是斯坦福大学。
MVC就是 Model-VIew-Controller,即模型-视图-控制器。
Model可以理解成你的程序要干的事情,或者说它的功能,比如你要开发一款星际争霸的游戏,你要设定有多少个行星,多少飞船,每个飞船的怎样的武器装备等等这些都属于model的范畴。至于说飞船应该在屏幕的哪个位置,则完全不属于model的范畴。
Controller的作用是,把model描述的东西,在屏幕显示出来。
View这里被描述成controller的”小跟班”, 当controller需要把model里的东西显示出来的时候,它需要利用view中的objects来辅助. 所以controller和view是相辅相成的。
再说说他们三个之间的联系和通信机制。看上图,controller可以控制model, 可以向model发送指令.因为他要把model呈现出来,所以必须对model有完全的控制权。
Controller对view也是有同样的控制权,因为他需要view的功能来把model呈现出来. 举个例子,我们用过outlet, 比如给屏幕上的按钮建立一个outlet,controller就可以通过这个outlet给view发消息,实现改变按钮的大小,位置等操作。
Model和view之间没有任何联系,不会通信. 假设说你现在有个工程不需要controller,完全用view来体现model, 理论上来说是可以的,但是这个代码的复用性就不高了,因为一旦你的model变化了,view也要随着一起变,这个view就没法复用。同样的这个model也没法复用。 要仔细的体会这一段。
View可以给controller发消息吗? 同样也是可以的. 比如我们给按钮建立一个action的连接,当按下按钮时,controller就会收到消息.这是其中一种从view到controller的通信机制。还有一种方式是controller把自己作为view的delegate(要实现某种协议), 这样当view有什么通知时,可以通过个delegate完成. 这种方法也是用得很多的,比如我前面的tableview系列的博客示例,里面用到delegation和datasource都是基于这个的。
Model会给controller发消息吗? 答案是肯定的,方法是通过KVO模型,KVO是什么不在这里讲了,自己去google. 用在这里,就是当model中的属性改变时,可以通知到controller了. Controller是观察者,model是被观察者. 比如飞船被炸毁了一个,controller获取通知后,在屏幕上把它移除。