(1)iOS概述
ios分为4层,这4层都和硬件密切相关,最下层最接近硬件,最上层最接近程序环境或引擎。
Core OS层
该层为最下层主要是mach4.x BSD UNIX内核,也就是Mac OS 10操作系统,是一个在硬件上能够执行多任务的UNIX内核。在这一层上,它提供了很多支持例如网络、socket、安全机制、文件系统,这里的API大多数都是C的API不是面向对象的,因为这是UNIX代码,我们一般不在这一层上写代码。
iOS开发学习教程

Core Services层

这层开始面向对象了,它提供了很多和底层一样的服务,但是是面向对象的API,还提供socket类、Runtime支持、多线程、集合类(如数组、字典)等。可以把这一层当做是提供面向对象支持的Core OS的封装。
iOS开发教程学习

Media层

这一层离硬件还是很近,因为iphone、ipad、itouch根本上是一个多媒体设备,多媒体相关的代码贯穿整个ios,在Core Services以上能看到的API都是关于多媒体的。
iOS开发学习教程

Cocoa Touch层

cocoa是mac os 10开发环境的名称,在ios上称它为cocoa touch。所有的按钮、滑动条、视图、导航栏、高层次的多媒体都在cocoa touch上,这是完全面向对象的。
iOS开发学习教程
(2)开发平台
工具:xcode 4、 instruments(插件,用来调试应用的内存的使用、图像性能等)
语言:objective-C
framework:相当于java里的package,是实现特定功能的一些对象的集合。基础的framework有数组、字典等,还有uikit、面向对象的数据库、mapkit、core motion
设计模式:MVC(model、view、controller),把所有的对象分为这三个阵营
model阵营是应用是做什么的,比如打飞机游戏中,飞船的位置、型号、飞船有多少个机枪、护甲多少就是model。
controller阵营是model如何展现在用户面前,比如获取到了飞船在太空中的位置,然后算出来怎么在屏幕上展现出来,飞船有多少机枪,如何在屏幕上展现,这就是controller,controller控制如何在UI上展现model。
view是controller的仆人,view就是controller使用的工具。尽可能地使view阵营里的对象通用化,像按钮、滑动条等,view绝对不包含任何有关于如何去表现应用。controller利用这些通用的view来做model需要做的事,view应该是很通用的(因为系统上有很多view,还有和应用相关的功能来控制view,利用通用view来理解和使用这些功能)。
有了这三个阵营,剩下的就是它们之间的管理和通信问题:
1、controller是怎么向model发送消息的?
controller向model发送消息是100%被允许的,controller可以问model任何问题,controller知道model的任何事情(因为controller就是用来把model展现在屏幕上的,所以它要有完全的访问权,但是方向是单向的,只有controller知道model)。
2、controller和view是如何通信的?
controller可以对view做任何事,outlet用来表示controller用来和view通信的一个属性,所以要在controller里创建outlet传到view中去。
3、model和view是如何通信的?
它们之间永远不会通信,因为model和用户交互界面无关,model完全是UI独立的。如果能通信,则model改变后,vjiew就得重写。
4、view能否被允许和controller通信?
某种程度上是可以的,view(通用的)和controller(详细控制如何在屏幕上展现model)之间的通信是不可见的。view有一个向controller通信的方法,是一个target action的结构方法。target action就是controller自己画一个target,然后把action交给它的view,当view发生一些事(比如按钮被按下),它会把action发送到target,然后controller就知道按钮被按了。这就是view向controller通信的机制,view告诉controller发生了什么,但是view对controller知道的并不多,只是简单地发送target action。view和controller之间还有比较复杂的通信,比如view要和controller保存同步,所以view要告诉controller发生了什么,或者将要发送什么,或者要问controller我是否允许发生,所以这些will、did、should是view要问的问题,这么做是因为controller把自己设为委托,用协议,设立一个协议,来回应will、did、should,还有view不用知道回应的controller是哪个类,delegation是另一个view和controller通信的方法。
view不是它显示的数据的所有者。view只是一个平面,用来显示数据,一个显示信息的平台,view没有实体变量也不会去存储,只有指向它们的指针。
view如何获得数据?
一个类似delegation的方法,它有一些协议,比如这里的data at和count。view会有一个数据源的设置,controller会回应数据源。
注意,数据源的delegation永远是controller,或者是controller指定的第三方,但不可能是model。
controller的工作是把model的信息传达给view,响应所有的delegation。因为它能获取model里的数据,决定怎么在屏幕上显示,这是它的职能。
5、model能访问controller吗?
model是UI独立的,不能向controller发话。这是controller的工作来用view显示model。那么当model的东西改变了,要更新controller的时候该怎么办?在ios里实现的方法是用一个广播站就像信息广播机制,有2个机制:通知和关键数据监听。当model改变了,它就在广播站广播,controller收听到了,然后就知道model什么东西改了。这是完全不可见的,同步的。这里的KVO也可以用于view和controller但不会是view和model。model广播非常好用,因为是不可见的,但也有限制,只能通知被允许通信的对象发生了什么事。
iOS开发学习教程
(3)Objective—C语言
obj-c里的信息存储方式是用properties,以前用的是instance variable。obj-c是C的超集,obj-c也有头文件和实现文件。实现文件在obj-c里是.m不是.c,如果程序中有.c文件也能编译。头文件是要包含它的超类,实现文件包含它的头文件。@interface关键字表示一个类声明,类似m文件里有@implementation。有一个很重要的是private和public,区别只是在h文件里还是m文件里,在头文件里的就是public的,不在就是private的。怎么声明private方法?可以在m文件里写@interface,一样没有超类,不同在于有个(),只有在m文件的开头有@interface,才放一些其他方法的声明,开头的这个@interface可以用来声明private。用来表示设置和获取的语法叫做property,public的property放在头文件里。在obj-c里比较特殊的是,一般不直接读取实体变量,而是用setter和getter。@synthesize用来自动实现property。@synthesize property名字 = 变量名,变量名是property的初始化实体变量。strong表示保存这个指针对象的内存直到结束使用,weak表示没有使用这个指针了,那就设为nill。property的初始值都是0。obj-c里比较特殊的是,如果发送消息给nill,什么也不会发生。有指针时就只分配了指针空间,没有创建。
该系列笔记为看《2011年冬季最新斯坦福大学公开课:iOS程序开发教程》所做

MVC and Introduction to Objective-C【中文字幕】


本文作者:写下一生的程序