iOS應用開發視頻教程筆記(一)MVC and Introduction to Objective-C


(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,什么也不會發生。有指針時就只分配了指針空間,沒有創建。

 

該系列筆記為看《2011年冬季最新斯坦福大學公開課:iOS程序開發教程》所做,視頻教程的網址:http://www.youku.com/playlist_show/id_16853809.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM