iOS快捷鍵及常用的設(shè)計模式

一剥汤、首先給大家匯總梳理一下IOS開發(fā)過程中常用的快捷鍵免姿。

快捷雖然不是必備的,但是對于提高開發(fā)效率棉圈,還是很有用的涩堤。

(1)Xcode相關(guān)

隱藏/顯示文件導(dǎo)航欄:?command + 0

顯示/關(guān)閉工具區(qū):Command? + Option + 0

顯示/隱藏調(diào)試區(qū): Command + Shift + Y

折疊/展開單一函數(shù): command + alt + ??/??

折疊/展開所有函數(shù):command + alt + shift + ??/??

向后/向前跳轉(zhuǎn):command + control + ??/??

切換一個類的聲明和實現(xiàn):command + control + ??/??

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

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

注釋/取消注釋:command + /

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

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

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

Tab? ? 接受代碼提示

Esc? ? 顯示代碼提示菜單

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

Ctrl +F?? 前移光標(biāo)

Ctrl +B?? 后移光標(biāo)

Ctrl +P?? 移動光標(biāo)到上一行

Ctrl +N?? 移動光標(biāo)到下一行

Ctrl +A?? 移動光標(biāo)到本行行首

Ctrl +E?? 移動光標(biāo)到本行行尾

Ctrl +T?? 交換光標(biāo)兩邊的單個字符

Ctrl +D?? 刪除光標(biāo)右邊的單個字符

Ctrl +K?? 刪除本行


(2)模擬器相關(guān)

Home鍵:command + shift + h

顯示后臺: command + shift + h h

左/右旋轉(zhuǎn)模擬器: command + ??/??

保存截圖到桌面:command+s


二、IOS中常用的設(shè)計模式

常用的設(shè)計模式有MVC分瘾、單例胎围、KVO、工廠德召、策略等白魂。注意有人認(rèn)為KVC也是屬于設(shè)計模式,其實KVC是屬性賦值的方式氏捞,跟設(shè)計模式無關(guān)碧聪。

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

MVC

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

M 模型對象

模型對象封裝了應(yīng)用程序的數(shù)據(jù)薯定,并定義操控和處理該數(shù)據(jù)的邏輯和運算始绍。例如,模型對象可能是表示游戲中的角色或地址簿中的聯(lián)系人话侄。用戶在視圖層中所進行的創(chuàng)建或修改數(shù)據(jù)的操作亏推,通過控制器對象傳達出去,最終會創(chuàng)建或更新模型對象年堆。模型對象更改時(例如通過網(wǎng)絡(luò)連接接收到新數(shù)據(jù))吞杭,它通知控制器對象,控制器對象更新相應(yīng)的視圖對象变丧。

V 視圖對象

視圖對象是應(yīng)用程序中用戶可以看見的對象芽狗。視圖對象知道如何將自己繪制出來,并可能對用戶的操作作出響應(yīng)痒蓬。視圖對象的主要目的童擎,就是顯示來自應(yīng)用程序模型對象的數(shù)據(jù)曼月,并使該數(shù)據(jù)可被編輯。盡管如此柔昼,在 MVC 應(yīng)用程序中,視圖對象通常與模型對象分離炎辨。在iOS應(yīng)用程序開發(fā)中捕透,所有的控件、窗口等都繼承自 UIView碴萧,對應(yīng)MVC中的V乙嘀。UIView及其子類主要負(fù)責(zé)UI的實現(xiàn),而UIView所產(chǎn)生的事件都可以采用委托的方式破喻,交給UIViewController實現(xiàn)虎谢。

C 控制器對象

在應(yīng)用程序的一個或多個視圖對象和一個或多個模型對象之間,控制器對象充當(dāng)媒介曹质∮へ控制器對象因此是同步管道程序,通過它羽德,視圖對象了解模型對象的更改几莽,反之亦然≌玻控制器對象還可以為應(yīng)用程序執(zhí)行設(shè)置和協(xié)調(diào)任務(wù)章蚣,并管理其他對象的生命周期∫碳校控制器對象解釋在視圖對象中進行的用戶操作纤垂,并將新的或更改過的數(shù)據(jù)傳達給模型對象。模型對象更改時磷账,一個控制器對象會將新的模型數(shù)據(jù)傳達給視圖對象峭沦,以便視圖對象可以顯示它。對于不同的UIView够颠,有相應(yīng)的UIViewController熙侍,對應(yīng)MVC中的C。例如在iOS上常用的UITableView履磨,它所對應(yīng)的Controller就是UITableViewController蛉抓。

MVC之間的關(guān)系:

1.Model和View永遠(yuǎn)不能相互通信,只能通過Controller傳遞剃诅。

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

3.Controller可以直接與View對話戴尸,通過outlet,直接操作View,outlet直接對應(yīng)到View中的控件,View通過action向Controller報告事件的發(fā)生(如用戶Touch我了)。Controller是View的直接數(shù)據(jù)源(數(shù)據(jù)很可能是Controller從Model中取得并經(jīng)過加工了)付魔。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、輕量級本地數(shù)據(jù)存儲

NSUserDefaults *df = [NSUserDefaults standardUserDefaults];

//把auth 和uid寫入本地

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

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

*/

IOS單例模式(singleton)

單例模式的意思就是只有一個實例陈哑。單例模式確保某一個類只有一個實例妻坝,而且自行實例化并向整個系統(tǒng)提供這個實例。這個類稱為單例類惊窖。

1.單例模式的要點:

顯然單例模式的要點有三個刽宪;一是某個類只能有一個實例;二是它必須自行創(chuàng)建這個實例界酒;三是它必須自行向整個系統(tǒng)提供這個實例圣拄。

2.單例模式的優(yōu)點:

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

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

IOS中的單例模式

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

1署辉、為單例對象實現(xiàn)一個靜態(tài)實例族铆,并初始化,然后設(shè)置成nil哭尝,

2哥攘、實現(xiàn)一個實例構(gòu)造方法檢查上面聲明的靜態(tài)實例是否為nil,如果是則新建并返回一個本類的實例材鹦,

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

4栅葡、適當(dāng)實現(xiàn)allocWitheZone,copyWithZone尤泽,release和autorelease欣簇。

下面以SurveyRunTimeData為例子:

static SurveyRunTimeData *sharedObj = nil; //第一步:靜態(tài)實例,并初始化坯约。

@implementation SurveyRunTimeData

+ (SurveyRunTimeData*) sharedInstance? //第二步:實例構(gòu)造檢查靜態(tài)實例是否為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? 鍵值觀察者模式熊咽,提供一種機制,當(dāng)指定的對象的屬性被修改后,則監(jiān)聽者就會接受到通知。就好像我們給手機定了一個鬧鐘闹丐,等到了制定的時間横殴,鬧鐘就會響起,我們就會知道時間到了卿拴。這個過程中衫仑,我們就是監(jiān)聽者梨与,鬧鐘就是被監(jiān)聽的對象

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

su.age = 12;

//Observer 觀察者是誰

//KeyPath監(jiān)聽的屬性粥鞋,比如監(jiān)聽學(xué)生的name屬性

//options :監(jiān)聽的內(nèi)容

//NSKeyValueObservingOptionNew,NSKeyValueObservingOptionOld這兩個參數(shù)的意思是監(jiān)聽它的新值和舊值

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

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

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

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

{

//change? 字典中的old? new? 是關(guān)鍵字瞄崇,專門用來存儲新值和老值

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

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

}

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


工廠

一般是大批量生產(chǎn)零件的地方,在IOS中窝稿,工廠設(shè)計模式表示我們可以將一類控件提出來(使用靜態(tài)方法)楣富,方便后期統(tǒng)一修改。其實這個也是大家常用的伴榔。如以下代碼:

//定義工廠類纹蝴,將常用的控件涉及到的屬性用靜態(tài)方法做一歸納總結(jié),方便統(tǒng)一修改

//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;


策略


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

這樣可能還是不太好理解集漾,我們舉個例子切黔,出行旅游:我們可以有幾個策略可以考慮:可以騎自行車,汽車具篇,做火車纬霞,飛機 ,當(dāng)然你也可以選擇步行驱显。每個策略都可以得到相同的結(jié)果诗芜,但是它們使用了不同的資源。選擇策略的依據(jù)是費用埃疫,時間伏恐,使用工具還有每種方式的方便程度 。

iOS應(yīng)用分析

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

法看成一個函數(shù)秤掌,他幾乎有相同的輸入?yún)?shù)和返回參數(shù)愁铺。我們可以把這個相同的函數(shù)可以抽象為基類(InputValidator)的一個方法(bool

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

(EmailValidator)闻鉴,他們需要在各自的實現(xiàn)里面去復(fù)寫父類的驗證方法茵乱。為了能夠正常的調(diào)用到驗證類的驗證方法,我們需要自定義一個

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

面調(diào)用InputValidator的驗證方法,然后在textFieldDidEndEditing代理方法里面調(diào)用CustomTextField的

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末送巡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盒卸,更是在濱河造成了極大的恐慌骗爆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔽介,死亡現(xiàn)場離奇詭異摘投,居然都是意外死亡,警方通過查閱死者的電腦和手機虹蓄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門谷朝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人武花,你說我怎么就攤上這事圆凰。” “怎么了体箕?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵专钉,是天一觀的道長。 經(jīng)常有香客問我累铅,道長跃须,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任娃兽,我火速辦了婚禮菇民,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己第练,他們只是感情好阔馋,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娇掏,像睡著了一般呕寝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婴梧,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天下梢,我揣著相機與錄音,去河邊找鬼塞蹭。 笑死孽江,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的番电。 我是一名探鬼主播竟坛,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钧舌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涎跨,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤洼冻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隅很,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撞牢,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年叔营,在試婚紗的時候發(fā)現(xiàn)自己被綠了屋彪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绒尊,死狀恐怖畜挥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婴谱,我是刑警寧澤蟹但,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站谭羔,受9級特大地震影響华糖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘟裸,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一客叉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦兼搏、人聲如沸卵慰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呵燕。三九已至,卻和暖如春件相,著一層夾襖步出監(jiān)牢的瞬間再扭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工夜矗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泛范,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓紊撕,卻偏偏與公主長得像罢荡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子对扶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容