一剥汤、首先給大家匯總梳理一下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的機制被使用的淋漓盡致明郭,充分理解iOS的MVC模式买窟,有助于我們程序的組織合理性。
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ù)用性次询。
今天先到這里荧恍,還要回去寫程序,有空再來屯吊。