一、首先給大家匯總梳理一下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的機制被使用的淋漓盡致,充分理解iOS的MVC模式,有助于我們程序的組織合理性。
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去處理每種邏輯,而且這樣做方便擴展,提高可復用性。
今天先到這里,還要回去寫程序,有空再來。