前言:
學完了底層c,c++之後,現在開始重新回頭進行上層的介面設計。既然做了就要做好,就如同過去c,c++做的一樣。過去的一年的時間精看了深入淺出mfc,C++程式設計語言,effective-c++,GOF和大話設計模式,粗看了more effective c++, c++ premier,linux程式設計,harly guide linux, 自覺在c++方面的戰果還算不錯,現在重新撿起剛從事半年多的ios,一方面是因為money,另一方面是因為過去確實底層能力不行,對於介面處於知其然而不知其所以然的狀態,現在重新看起,書籍一定是必需品了。買了兩本書,ios開發指南和ios設計模式解析。這一段部落客要記錄書籍的學習過程,還有過去的未竟的任務,將好的思想,好的策略濃縮一下便於為我所用。
ios開發指南
國人寫的書,一直對國人的技術書籍有種抵觸情緒,不過看這本書的目錄結構比較適合我,於是放棄了精通ios開發那本而選擇了這本。這本書有點太厚了,接近700頁,拿在手上不適合,太重,講的東西多,但是不算雜,各項均有涉及,有個別錯誤,內容不算高深,適合我這樣的小半桶水看。ios設計模式解析是沒有時間看了,先讓它睡著吧,把基本的撿起來以便於自己好迅速的上手公司的代碼,要不然以後工作有我受的了。
第一章
xcode簡介,書籍圖片,內容介紹,書中源碼連結。沒啥有太大意義的內容。
第二章
應用程式的生命週期值得讀一讀。
開啟程式: Not Run (applicationDidFinishLauch) -> InActive (ApplicationDidBecomeActive)-> Active
程式後台: Active (applicationWillResignActive) -> InActive -> Backgroud (applicationDidEnterBackgroud)-> Suspend (applciationWillTerminate) -> Terminate
掛起運行: Suspend -> Backgroud (applciationWillEnterForgroud) -> InActive (applicationWillBecomeActive) -> Active
當系統記憶體不足的時候,背景Suspend程式有可能會被系統kill掉,沒有通知。
視圖的生命週期
loadView(得到一個view) -> ViewDidLoad(在產生的view後添加subview以進行自我的定製) -> ViewWillAppear -> viewWillDisappear -> didReceiveMemoryWarnning (收到記憶體警告) -> viewDidUnLoad
loadView是為了建立self.view,當從nib檔案中去載入就會直接建立self.view,因此loadView也就不需要了。
Xcode的project和target
一個project對應這多個target,project的設定是公用的,target的設定可以覆蓋project的設定。在target的summary選項下,設定螢幕表徵圖57*57, Icon.png,retina螢幕為Icon@2x.png, 啟動螢幕為320*480,Default.png或者retina螢幕為Default@2x.png, 裝置支援選項。
ios Api簡介
架構太多,不容易記憶,再說必要性不是很大。注意大的有四個層次: Cocoa Touch, Media, Core Services, Core OS。具體的每一個層次包含什麼,暫時不關心。還有如何使用協助文檔,alt+滑鼠點擊-》開啟協助文檔
第三章 基本的設計模式
ios常用設計模式,這個我比較擅長,相對就簡單多了。
單例模式
沒有使用synchronized機制,使用gcd的一種dispatch_once機制來維護僅僅執行一次的操作,比加鎖效率高一些,至於內部原理,暫時不懂,不過以後會搞定它的底層的。來個簡單程式碼範例便於以後copy
@interface Singleton : NSObject
@end
@implementation Singleton
static Singleton *_shareSingleton = nil;
+ (Singleton*) sharedManager
{
static dispatch_once_t once;
dispatch_once(&once, ^{
_shareSingleton = [[Singleton alloc]init];
//...... your other initial code here
}
);
return _shareSingleton;
}
思想很簡單,私人靜態指標,類方法中分配記憶體並返回這個指標。為了防止多線程同時訪問可能會建立幾個對象,可以採用加鎖,為了提高效率,有一種二次探測的策略;這裡採用的GCD的內容保證只執行一次。
樣本: UIAccelerometer NSUserDefault NSNotificationCenter等等。
委託模式
我比較撓頭的一種模式,說起來就是我定義了一個架構,但是又想給使用者以個人化的操作,於是將個人化的操作提取出來,製作成協議,讓客戶去實現協議。舉個UITableView的例子, ViewController實現UITableViewDelegate協議, viewController持有一個UItableView的指標,設定tableView.delegate = self。這樣tableView相當於將個人化的操縱留給了ViewController去完成了。
簡單類圖:
UITableViewDelegate
|
|
UITableView (持有delegate指標)------------->MyViewController(持有tableView指標,並設定delegate)
MyViewController繼承delegate同時持有tableView的指標,這個是一個強引用。UITableView也持有一個delegate指標,由於這個指標最終要賦值為MyViewController對象,因此為了避免循環參考,一定是一個弱引用。一般是在MyViewControlller中設定tableView.delegate為自身,也就是說MyViewController負責實現delegate方法。這樣UITableView自身實現了TableView的基本架構,同時將使用者的個人化的可擴充的地方弄成協議供客戶實現。協議的調用肯定是UITableView內部架構去做的,它需要資料的時候就去協議要資料,協議呢給使用者以最大的擴充性,同時使用者有不用關心UITableView具體的內部是如何呈現了,使用者只需要提供資料就行了。樣本 UITextField Application
觀察者模式
相當簡單的一種設計模式,但是又相當常用。一定要記住一個Subject,n多個Observer。Subject需要實現addObserver,removeObserver,notifyAllObservers的方法,同時有一個observers數組儲存所有的observer;observer需要實現update方法。當需要更新資料的時候,調用notifyAllObservers方法,這個方法中遍曆數組的所有observer,調用observer的update方法去更新資料。通知中樞就是一個subject,為了方便使用它以單例模式實現的,後面有空要實現一個通知中樞,讓自己理解更深刻一些。
KVO也是一種觀察者模式,KVO會自動給Subject類建立一個子類,然後將Subject類的isa指標指向衍生類別.在衍生類別內部添加通知觀察者的代碼,需要使用setValueForKeypath的方式,因為這種方式的衍生類別內部才添加了notifyObserver的方法。添加屬性觀察的Subject需要調用addObserver方法來添加觀察者,當屬性改變,觀察者的ObserverForKeyPath會唄調用。這個有空也實現一個,應該不算複雜,主要是內部機制自己理解還不是很透徹。
MVC模式
Cocoa中的MVC的模型和視圖沒有任何互動,全是通過中間人ViewController互動的。
ViewController持有很多View的對象指標(IBOutlet),因此可以直接操縱view,view可以通過委託和協議的機制將操作反饋給ViewController,還有button的回調(IBAction)也可以反饋到Controller。
Controller也一般持有model的指標,可以直接更新model資料;model資料可以使用Notification和KVO機制將model的更改通知給Controller。上面的這幾個策略基本上概括了整個MVC的東西,斯坦福公開課有一個圖片很好,大家值得一看。
OK,就到這裡吧,得回家了,太晚了,明天繼續寫。