(1)ios概述
ios分為4層,這4層都和硬件密切相關,最下層最接近硬件,最上層最接近程序環境或引擎。
Core OS層
該層為最下層主要是mach4.x BSD UNIX內核,也就是Mac OS 10操作系統,是一個在硬件上能夠執行多任務的UNIX內核。在這一層上,它提供了很多支持例如網絡、socket、安全機制、文件系統,這里的API大多數都是C的API不是面向對象的,因為這是UNIX代碼,我們一般不在這一層上寫代碼。
Core Services層
這層開始面向對象了,它提供了很多和底層一樣的服務,但是是面向對象的API,還提供socket類、Runtime支持、多線程、集合類(如數組、字典)等。可以把這一層當做是提供面向對象支持的Core OS的封裝。
Media層
這一層離硬件還是很近,因為iphone、ipad、itouch根本上是一個多媒體設備,多媒體相關的代碼貫穿整個ios,在Core Services以上能看到的API都是關於多媒體的。
Cocoa Touch層
cocoa是mac os 10開發環境的名稱,在ios上稱它為cocoa touch。所有的按鈕、滑動條、視圖、導航欄、高層次的多媒體都在cocoa touch上,這是完全面向對象的。
(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廣播非常好用,因為是不可見的,但也有限制,只能通知被允許通信的對象發生了什么事。
(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,什么也不會發生。有指針時就只分配了指針空間,沒有創建。