iOS快捷鍵及常用的設計模式

一、首先給大家匯總梳理一下IOS開發過程中常用的快捷鍵。

快捷雖然不是必備的,但是對于提高開發效率,還是很有用的。

(1)Xcode相關

隱藏/顯示文件導航欄:?command + 0

顯示/關閉工具區:Command? + Option + 0

顯示/隱藏調試區: Command + Shift + Y

折疊/展開單一函數: command + alt + ??/??

折疊/展開所有函數:command + alt + shift + ??/??

向后/向前跳轉:command + control + ??/??

切換一個類的聲明和實現:command + control + ??/??

整體向左/右移動選中代碼:command + [/]

自動縮進選中代碼: control + i

注釋/取消注釋:command + /

在.h和.m之間切換? ctrl+command+???

向左移動代碼塊? command+[?

向右移動代碼塊? command+]?

Tab? ? 接受代碼提示

Esc? ? 顯示代碼提示菜單

Ctrl +/? ? 移動到代碼提示中的下一個占位符

Ctrl +F?? 前移光標

Ctrl +B?? 后移光標

Ctrl +P?? 移動光標到上一行

Ctrl +N?? 移動光標到下一行

Ctrl +A?? 移動光標到本行行首

Ctrl +E?? 移動光標到本行行尾

Ctrl +T?? 交換光標兩邊的單個字符

Ctrl +D?? 刪除光標右邊的單個字符

Ctrl +K?? 刪除本行


(2)模擬器相關

Home鍵:command + shift + h

顯示后臺: command + shift + h h

左/右旋轉模擬器: command + ??/??

保存截圖到桌面:command+s


二、IOS中常用的設計模式

常用的設計模式有MVC、單例、KVO、工廠、策略等。注意有人認為KVC也是屬于設計模式,其實KVC是屬性賦值的方式,跟設計模式無關。

大家一般對MVC、單例、KVO、工廠比較熟悉,對策略稍有生疏。下面我給大家一一梳理一下,有不對的地方請大家指正。

MVC

模型-視圖-控制器(Model-View-Controller,MVC)是Xerox PARC在20世紀80年代為編程語言Smalltalk-80發明的一種軟件設計模式,至今已廣泛應用于用戶交互應用程序中。在iOS開發中MVC的機制被使用的淋漓盡致,充分理解iOSMVC模式,有助于我們程序的組織合理性。

M 模型對象

模型對象封裝了應用程序的數據,并定義操控和處理該數據的邏輯和運算。例如,模型對象可能是表示游戲中的角色或地址簿中的聯系人。用戶在視圖層中所進行的創建或修改數據的操作,通過控制器對象傳達出去,最終會創建或更新模型對象。模型對象更改時(例如通過網絡連接接收到新數據),它通知控制器對象,控制器對象更新相應的視圖對象。

V 視圖對象

視圖對象是應用程序中用戶可以看見的對象。視圖對象知道如何將自己繪制出來,并可能對用戶的操作作出響應。視圖對象的主要目的,就是顯示來自應用程序模型對象的數據,并使該數據可被編輯。盡管如此,在 MVC 應用程序中,視圖對象通常與模型對象分離。在iOS應用程序開發中,所有的控件、窗口等都繼承自 UIView,對應MVC中的V。UIView及其子類主要負責UI的實現,而UIView所產生的事件都可以采用委托的方式,交給UIViewController實現。

C 控制器對象

在應用程序的一個或多個視圖對象和一個或多個模型對象之間,控制器對象充當媒介。控制器對象因此是同步管道程序,通過它,視圖對象了解模型對象的更改,反之亦然。控制器對象還可以為應用程序執行設置和協調任務,并管理其他對象的生命周期。控制器對象解釋在視圖對象中進行的用戶操作,并將新的或更改過的數據傳達給模型對象。模型對象更改時,一個控制器對象會將新的模型數據傳達給視圖對象,以便視圖對象可以顯示它。對于不同的UIView,有相應的UIViewController,對應MVC中的C。例如在iOS上常用的UITableView,它所對應的Controller就是UITableViewController。

MVC之間的關系:

1.Model和View永遠不能相互通信,只能通過Controller傳遞。

2.Controller可以直接與Model對話(讀寫調用Model),Model通過Notification和KVO機制與Controller間接通信。

3.Controller可以直接與View對話,通過outlet,直接操作View,outlet直接對應到View中的控件,View通過action向Controller報告事件的發生(如用戶Touch我了)。Controller是View的直接數據源(數據很可能是Controller從Model中取得并經過加工了)。Controller是View的代理(delegate),以同步View與Controller。


單例


首先看一下單例的例子:

/**

*? ? ? ? ? 單例的寫法常用的有三種方式:

方式1、不考慮線程

static SingleCase *manager = nil;

+ (SingleCase *)defaultManager {

if (!manager){

SingleCase = [[self alloc] init];

return manager;

}

}

方式2、考慮線程安全

+ (SingleCase *)sharedManager

{

static SingleCase *ManagerInstance = nil;

static dispatch_once_t predicate;

dispatch_once(&predicate, ^{

ManagerInstance = [[self alloc] init];

});

return ManagerInstance;

}

方式3、輕量級本地數據存儲

NSUserDefaults *df = [NSUserDefaults standardUserDefaults];

//把auth 和uid寫入本地

[df setObject:responseObject[M_Auth] forKey:M_Auth];

[df setObject:responseObject[M_Uid] forKey:M_Uid];

*/

IOS單例模式(singleton)

單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。這個類稱為單例類。

1.單例模式的要點:

顯然單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。

2.單例模式的優點:

1.實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例。

2.靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程

IOS中的單例模式

在objective-c中要實現一個單例類,至少需要做以下四個步驟:

1、為單例對象實現一個靜態實例,并初始化,然后設置成nil,

2、實現一個實例構造方法檢查上面聲明的靜態實例是否為nil,如果是則新建并返回一個本類的實例,

3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不產生一個新實例,

4、適當實現allocWitheZone,copyWithZone,release和autorelease。

下面以SurveyRunTimeData為例子:

static SurveyRunTimeData *sharedObj = nil; //第一步:靜態實例,并初始化。

@implementation SurveyRunTimeData

+ (SurveyRunTimeData*) sharedInstance? //第二步:實例構造檢查靜態實例是否為nil

{

@synchronized (self)

{

if (sharedObj == nil)

{

[[self alloc] init];

}

}

return sharedObj;

}

+ (id) allocWithZone:(NSZone *)zone //第三步:重寫allocWithZone方法

{

@synchronized (self) {

if (sharedObj == nil) {

sharedObj = [super allocWithZone:zone];

return sharedObj;

}

}

return nil;

}

- (id) copyWithZone:(NSZone *)zone //第四步

{

return self;

}

- (id) retain

{

return self;

}

- (unsigned) retainCount

{

return UINT_MAX;

}

- (oneway void) release

{

}

- (id) autorelease

{

return self;

}

- (id)init

{

@synchronized(self) {

[super init];//往往放一些要初始化的變量.

return self;

}

}

@end


KVO


KVO? Key-Value Observing? 鍵值觀察者模式,提供一種機制,當指定的對象的屬性被修改后,則監聽者就會接受到通知。就好像我們給手機定了一個鬧鐘,等到了制定的時間,鬧鐘就會響起,我們就會知道時間到了。這個過程中,我們就是監聽者,鬧鐘就是被監聽的對象

我們創建一個student類,使用KVO模式,給其中的username 屬性添加監聽者(觀察者 XSStudent*su = [[XSStudentalloc]init];? ? su.name= @"zhangsan";

su.age = 12;

//Observer 觀察者是誰

//KeyPath監聽的屬性,比如監聽學生的name屬性

//options :監聽的內容

//NSKeyValueObservingOptionNew,NSKeyValueObservingOptionOld這兩個參數的意思是監聽它的新值和舊值

[su addObserver:self forKeyPath:@"name"options:NSKeyValueObservingOptionNsw|NSKeyValueObservingOptionOld context:nil];

//修改屬性,觸發方法? ? su.name= @"lis";

//觀察者觀察到有值發生改變的時候發生的方法

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context

{

//change? 字典中的old? new? 是關鍵字,專門用來存儲新值和老值

NSLog(@"oldname %@",[changeobjectForKey:@"old"]);??

NSLog(@"new %@",[change objectForKey:@"new"]);

}

注意,這里(NSString*)keyPath 傳過來的就是你添加觀察者的時候創建的key? ,如果想要監聽多個屬性,你可以根據整個值來判斷到底是哪個值的變化觸發了該方法


工廠

一般是大批量生產零件的地方,在IOS中,工廠設計模式表示我們可以將一類控件提出來(使用靜態方法),方便后期統一修改。其實這個也是大家常用的。如以下代碼:

//定義工廠類,將常用的控件涉及到的屬性用靜態方法做一歸納總結,方便統一修改

//UIView

+ (UIView *)createViewWithFrame:(CGRect)frame;

//UILabel

+ (UILabel *)createLabelWithFrame:(CGRect)frame text:(NSString *)text textColor:(UIColor *)textColor backgroundColor:(UIColor *)backgroundColor font:(UIFont *)font textAlignment:(NSTextAlignment)textAlignment;

//UIButton

+ (UIButton *)createButtonWithFrame:(CGRect)frame title:(NSString *)title titleColor:(UIColor *)titleColor backgroundColor:(UIColor *)backgroundColor type:(UIButtonType)type target:(id)target? selector:(SEL)selector;

//UIImageView

+ (UIImageView *)createImageViewWithFrame:(CGRect)frame imageName:(NSString *)imageName;

//UITextField

+ (UITextField *)createTextFieldWithFrame:(CGRect)frame text:(NSString *)text placeholder:(NSString *)placeholder;


策略


同一個問題可以有多個解決辦法,我們可以將這個多個解決辦法封裝成不同的方法,我們在使用的時候根據自己的需要選擇合適的方法。選擇其中一種方法,對其他的方法是沒有影響的,我們把這個過程叫做策略設計模式。

這樣可能還是不太好理解,我們舉個例子,出行旅游:我們可以有幾個策略可以考慮:可以騎自行車,汽車,做火車,飛機 ,當然你也可以選擇步行。每個策略都可以得到相同的結果,但是它們使用了不同的資源。選擇策略的依據是費用,時間,使用工具還有每種方式的方便程度 。

iOS應用分析

例如,我們在驗證用戶輸入的表單的時候,加入包括電話輸入框的驗證和郵件輸入框的驗證,這兩部分的驗證算法是不同的,如果把這個算

法看成一個函數,他幾乎有相同的輸入參數和返回參數。我們可以把這個相同的函數可以抽象為基類(InputValidator)的一個方法(bool

validateInput(input,error)),然后抽象出兩個具體的策略類:電話驗證類(PhoneValidator)和郵件驗證類

(EmailValidator),他們需要在各自的實現里面去復寫父類的驗證方法。為了能夠正常的調用到驗證類的驗證方法,我們需要自定義一個

UITextField的子類CustomTextField,其中有一個InputValidator類型的引用和一個validate方法,該方法里

面調用InputValidator的驗證方法,然后在textFieldDidEndEditing代理方法里面調用CustomTextField的

validate方法,這樣就不用我們在判斷輸入是否合法的時候通過if else去處理每種邏輯,而且這樣做方便擴展,提高可復用性。

今天先到這里,還要回去寫程序,有空再來。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容