一、Xcode工具配置 1、網絡訪問配置:     在Info.plist文件中添加App Transport Security Settings->NSAllowsAritraryLoads-> YES 2、iOS10之后權限設置:     同樣需要在Info.plist文件中直接添加     PRivacy - Media Library Usage Description  訪問媒體資料庫     Privacy - Bluetooth Peripheral Usage Description  訪問藍牙等系統功能在需要調用的時候都需要進行請求授權操作。 3、以上操作有兩種方式可以設置 <1>.直接Xcode打開Info.plist文件直接添加,如圖:  <2>.選擇Info.plist->右擊->Open As->Source Code,如圖:
 <2>.選擇Info.plist->右擊->Open As->Source Code,如圖:  打開之后如下,可以直接在code中添加:
 打開之后如下,可以直接在code中添加:  二、設計模式 1、什么事設計模式?     在軟件設計?,是對通?問題的可復?的解決?案!
 二、設計模式 1、什么事設計模式?     在軟件設計?,是對通?問題的可復?的解決?案!
2、為什么要用設計模式? 設計模式是?系列幫你寫出更可理解和易復?代碼的模板,設計模式幫你創建低耦合的代碼以便你不需要費多??就可以改變或者替換代碼中的組件!
3、設計模式類型有? <1>.創建型:單例(單態)和抽象工廠 <2>.結構型:模型-視圖-控制器,裝飾器、適配器,外觀和組合模式 <3>.行為型:觀察者、備忘錄、責任鏈和命令模式
4、什么時候,如何使?,什么樣的,設計模式? <1>.MVC(解偶和)(復?-拓展-維護) Model -View- Controller 模型-視圖-控制器model和view之間是相互獨?的,不知道對?的存在;controller負責他們之間的溝通和聯系,實現低耦合,從?使代碼易復?,易維護,易拓展 的;控制器的?為通過三種技術實現,delegate,targetaction,notification-kvo; C對M:API C對V:Outlet V對C:Target-action, Delegate,Datasource M對C:Notification,KVO
<2>.單例模式(整個?程對象唯?/節省資源-全局變量/保持數據) 概念: 核心結構中只包含一個被稱為單例的特殊類,用static聲明單例對象(全局變量),確保此工程唯一實例對象(且該實例易于外界訪問),對象的實例變量和屬性的生命周期是整個工程開始和結束,目的是為數據保存共享,注意多線程條件下加鎖,避免多線程同時創建單例!(如果需要多次調用對象的屬性保存添加數據,就用單例,而普通對象重復創建無法保存長期數據)
優點: a.創建對象alloc浪費系統資源和時間 ,單例節省資源時間; b.多模塊訪問同一變量,單例中則訪問容易,數據保存共享,避免多模塊相互傳遞風險和復雜; c.唯一全局實例對象;
缺點: 單例模式使得對象變成了全局的,降低了每個單獨模塊的靈活性;
典型的系統單例
UIapplication(應用程序實例)NSNotificationCenter(消息中心)NSFileManager(文件管理)NSUserDefaults(系統單例)NSURLCache(請求緩存)NSHTTPCookieStorage(應用程序cookies池)獲取APPDelegate
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;單例舉例
+(MyUserInfo *)sharedInstance{ static MyUserInfo *userInfo = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken,^(void) { userInfo = [[self alloc] initialize]; }); return userInfo;}static HttpRequestManager *manager = nil;+(HttpRequestManager *)shareManager{ @synchronized(self){ if (manager == nil) { manager = [[HttpRequestManager alloc] init]; } } return manager;}3、觀察者模式(通知和KVO-類間傳消息和值/解偶和)(對應MVC中 Model-Controller?Notification和kvo) <1>.KVC/KVO(鍵值編碼-批量復制/鍵值觀察)     KVC主要用于批量賦值,有setValue:@"" forKey:@""和valueForKey兩種方法分別對應setter和getter方法
給對象的屬性賦值時使用:
User* user = [[User alloc] init];[user setValue:@"張三" forKey:@"name"][user setValue:@"65" forKey:@"weight"];如KVO的對象屬性值發生變化,就會通知做相應的操作:
[user addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL];變化后處理函數:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ …}通知NSNotification(跨類傳消息和值,消息發送者和接收者完全不知道對?,完全解偶和;可以創建多個觀察者,消息具有?播性質,不需要時注意向通知中?注銷觀察者)
//發送通知[[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:saveImageArray];//接收通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(PostImage:) name:@"postData" object:nil];//接收通知實現方法-(void)PostImage:(NSNotification*) notification{ //接收到消息后實現內容}//移除通知中?[[NSNotificationCenter defaultCenter] removeObserver:self name:@"postData" object:nil];通知實現原理/KVO實現原理 通知原理是接收端把接收函數注冊到通知中心數組中,發送端發送數據就直接調用之前接收端注冊函數,NSNotification是同步方式;KVO是對所關心的屬性對象添加觀察者,當屬性值發生變化時會得到通知,我們可以對變化做相應的處理。
4、代理模式(回調-多繼承-解偶和)(對應MVC中View-Controller ?Delegate或Datasource) <1>.協議:制訂協議,定義方法;誰遵守協議,誰實現方法; <2>.代理:往往結合協議,設置代理,代理調用協議方法;遵守代理,實現代理協議方法;相當于A類在B類的方法實現內容和返回值; <3>.步驟:
定義協議,設置方法;設置代理,代理調用協議方法;遵守協議,接受代理,代理實現協議方法;.h文件中設置協議方法
#import <UIKit/UIKit.h>// 協議方法@protocol ReplyInputViewDelegate <NSObject>-(void)clickSenderReplyButton:(UIButton *)sender;@end// 設置代理@property (nonatomic,strong) id<ReplyInputViewDelegate>delegate;.m中實現
-(void)clickSenderButton:(UIButton *)sender{ if (self.delegate &&[self.delegate respondsToSelector:@selector(clickSenderReplyButton:)]) { [self.delegate clickSenderReplyButton:sender]; }}在控制器中藥遵循代理,并實現方法:  
 
方法和協議方法區別(類和類之間,協議不是類卻相當于類) a.?法?般只能在?個類中實現,協議?法的優勢就在于此?法可以在任意類中實現后回調,協議?法實現相對整個類是獨?模塊,達到了解偶和;類中繼承?個類就具有這個類的?法可以重構,?不能在另外繼承就是單繼承;?通過協議就繼承了協議?法,相當于重構了?法,實現類似多繼 承; b.協議實現部分多繼承功能(遵守協議就相當于繼承了協議得?法),遵守協議后有@optional可選實現、@required必實現的?法,協議就是規范接?的;代理是?種設計模式,當?個類的某些功能??不去做,需要由任何類來實現;
5、簡單工廠模式 blocks(代替部分協議功能-接?-回調) blocks代替部分協議代理功能,使?簡單,不需要太多@protocol定義接?,主要實現接?,反向傳值,回調的代碼!
typedef NSString *(^loggerBolck)(NSString *) ;//定義//實現loggerBolck blocks = ^(NSString *str){ ... }; NSString *allstr = @"allstr";NSString *str = @"str";str = blocks(allstr); //調?NSString *(^loggerBolck)(NSString *) ;loggerbolck = ^(NSString *str){ ... };NSString *allstr = @"allstr";NSString *str = @"str";str = loggerbolck(allstr);NSString *(^loggerbolck)(NSString *)= ^(NSString *str){ ... };NSString *allstr = @"allstr";NSString *str = @"str";str = loggerbolck(allstr);Block注意點
blocks在類中做屬性要?copy(?論arc和mrc) //保留blocks?命周期,copy不?retain,要注意release,否則就autorelease__weak typeof(self) weakSelf = self;//把??設置位弱引?//__weak TCPClient *weakSelf = self; blocks?調?self時要設成弱引?對象,避免循環引?;防?在block中?到self時把self對象retain, 造成內存泄露;typedef void(^SendMessage)(MessageObject*); //定義block__weak TCPClient *weakSelf = self; //self設置為弱引?//實現blocksSendMessage sendMessage = ^(MessageObject *messageObejct){ NSString *sendString = [NSString stringWithFormat:@"%@",[messageObejct convertToString]]; NSData *sendData = [sendString dataUsingEncoding:NSUTF8StringEncoding]; [weakSelf.socketClient writeData:sendData withTimeout:-1 tag:0]; [weakSelf.socketClient readDataWithTimeout:-1 tag:0];}; self.sendMessage (messageObject); //調?blocks注:小白第一次寫,如有錯誤歡迎批評指正,一起成長。
新聞熱點
疑難解答