### 多線程總結
#### 多線程本人感覺最重要的兩個點:
~~~
dispatch_async(dispatch_get_global_queue){
NSLog(@"我在做耗時的操作");
dispatch_sync(dispatch_get_main_queue){
NSLog(@"我回到了主線程更新UI");
}
}
[self.queue addOperationWithBlock:^{
NSLog(@"異步下載圖片");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"我回到了主線程更新UI");
}];
}];
~~~
#### 多線程基礎
##### 1.什么是多線程,為什么要使用多線程,多線程的優缺點?
開啟多個任務同時執行。
解決耗時任務在主線程造成的程序卡死的現象
優點:能適當提高程序的執行效率,能適當提供資源的利用率;
缺點:開啟的線程越多占據的內存和CPU越多,就會降低程序的執行效率。
##### 2.進程和線程?
進程:系統中正在運行的應用程序。每一個進程之間都是相互獨立的,進程在內存中由專用的受保護的內存空間。
線程:線程是進程的基本執行單元,進程中所有的任務都是在線程中執行的。一個進程至少有一個線程。
##### 3.主線程的作用和使用注意?
執行UI刷新事件和點擊事件
不要將耗時的操作放到主線程
##### 4.多線程的技術實現方案?
pthread c語言 線程的生命周期由程序員控制 基本不使用
NSThread oc語言 線程的生命周期由程序員管理 偶爾使用
GCD oc語言 GCD管理線程的生命周期 經常使用
NSOperation oc語言 不用關心線程的生命周期 經常使用,iOS8 之后蘋果推薦使用
##### 5.__bridge
arc下將c語言的字符串轉換成oc字符串!
##### 6.NSThread的創建方式?
~~~
NSThread *thread=[[NSThread alloc] initWithTarget];
[NSThread detachNewThread…];
[self performSelectorInBackGround…];
~~~
##### 7.線程的狀態介紹?
創建 -> 就緒 -> 運行 ->阻塞 -> 死亡
##### 8.線程的屬性?
name 定位到錯誤所在的線程
優先級 能調節線程被執行的可能性,不能保證先執行
##### 9.多線程使用的時候需要注意什么?
防止多個線程訪問同一個資源
##### 10.互斥鎖和自旋鎖?
都能解決多線程訪問導致的數據安全問題。
互斥鎖:遇到鎖就等待,呆會再來
自旋鎖:遇到鎖就在門口等著
自旋鎖的執行效率比互斥鎖要好
##### 11.iOS 9.0 關于網絡請求的新特性
ATP(https)
##### 12.常見的屬性修飾符號以及他們的應用場景?
strong,weak,assign,copy
strong -對象類型
weak delegate,UI控件連線類型
copy 字符串,block
assign 基本數據類型
##### 13.自動釋放池的原理?
在主線程的消息循環開啟的時候會創建,當消息循環結束的時候就會傾倒自動釋放池。
##### 14.什么時候使用自動釋放池?
~~~
1>循環內部創建大量的臨時對象的時候,在循環內部創建自動釋放池
2>創建子線程的時候,在線程剛剛開始的位置,創建自動釋放池
~~~
#### 多線程進一步了解
##### 1.什么是消息循環?
運行循環就可以簡單的理解成,每一個線程開啟的一個循環,主線程默認會打開。當有輸入事件傳入的時候,并且模式匹配的時候就會打開運行循環執行相應的事件。運行循環的目的就是保證程序的不退出,處理輸入事件,如果沒有事件發生,就讓程序進入休眠狀態。
輸入事件,有兩種輸入源和定時源。
運行循環常用的幾種模式,
##### 2.GCD中的幾個概念?
任務:需要執行什么操作
隊列:用來存放任務
定制任務,將任務添加到隊列
隊列中分串行隊列,并行隊列,主隊列和全局隊列
執行方式: 串行和并行
##### 3.GCD中組合使用的特點?
串行隊列
同步執行 不開線程,順序執行
異步執行 開一個線程,順序執行
并行隊列(全局隊列)
同步執行 不開線程,順序執行
異步執行 開多個線程,無序執行
主隊列
同步執行 主線程上執行的話會死鎖。
異步執行 主線程,順序執行
##### 4.同步任務?
異步的去執行,有相互依賴的操作
##### 5.barrier(阻塞)?為什么使用自定義的全局隊列?
主要用在多個異步操作完成之后,對 非線程安全 的對象進行統一更新。適合大規模的 i/o操作。
dispatch_get_global_queue(0,0)數據操作不是在同一個線程中去執行.
##### 6.GCD中常見的函數?
~~~
dispatch_syn
dispatch_asyn
dispatch_after
dispatch_once_
~~~
##### 7.單例
~~~
static id instance = nil;
+ (instancetype)sharedNetworkToolsOnce {
return [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (instance == nil) {
instance = [super allocWithZone:zone];
}
});
return instance;
}
-(id)copyWithZone:(NSZone *)zone
{
return self;
}
~~~
##### 8.調度組的使用
~~~
dispatch_group_async(dispatch_group_create(), dispatch_get_global_queue(0, 0), ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"download A %@", [NSThread currentThread]);
});
dispatch_group_notify(dispatch_group_create(), dispatch_get_main_queue(), ^{
NSLog(@"dowload finished %@", [NSThread currentThread]);
});
~~~
##### 9. NSOperation 的使用
創建操作,把操作添加到隊列!!op會自動調用start,main方法!
~~~
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];
//隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//把操作添加到隊列
[queue addOperation:op];
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
}];
[op start];
~~~
#### GCD和NSOperation
##### 1.GCD和NSOperation 的區別與聯系?
GCD中兩個核心的概念。隊列和任務,GCD中是怎么實現的。首先是創建隊列,然后定制任務。最后是將任務添加至隊列。
然后這個里面就有很多概念了。隊列中有串行隊列,并行隊列,主隊列,全局隊列。其中我們要求重點掌握的就是主隊列和全局隊列,其實主隊列本質上就是一個串行隊列,全局隊列就是一個并行隊列。
任務的話,有同步任務和異步任務。
任務之間的依賴我們可以使用同步任務的方式和barrier(阻塞)來執行。大家想一下還能不能回憶起來。
最后是線程間通訊,不管同步還是異步是不是最后都要回到主隊列中去更新數據或者刷新UI顯示。是不是dispatch_sync(dispatch_get_main_queue).
然后GCD中還有一些小的知識點就是主隊列,同步執行會出現死鎖!這個還有印象嗎?怎么產生,相互等待。怎么解決?
GCD中一次性執行代碼!有一個非常重要的應用場景就是單例!
另外一個知識點就是延遲操作。Dispatch_afterNSOperation 將操作(異步)添加到隊列(全局的并發隊列)。
NSOperation的使用是不是更加面象對象。NSOperation是一個抽象的類,我們使用的是他的子類。
首先我們學習了一個搖獎機的小示例程序。那個小示例程序中有一點是需要大家注意的就是取消和暫停都會把正在執行的任務先執行完畢后,才會取消或者暫停隊列中的任務。
然后我們還學習了一個最大并發數,GCD中我們能控制線程數嗎?不能,GCD中會自動幫我們管理線程。需要注意的就是最大并發數并不是線程數,我們可以通過最大并發數來控制線程數。
NSoperation中也可以實現操作依賴,GCD中實現操作依賴的方式有什么?
同步和阻塞
這個和GCD中有不同的就是NSOperation可以跨隊列設置操作間的依賴。。
##### 2.暫停
NSOpeartion控制線程的暫停,取消,記住取消和暫停的都不能取消當前正在執行的任務。
3.寫一個異步加載網絡圖片的小程序
~~~
[self.queue addOperationWithBlock:^{
NSLog(@"異步下載圖片");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"我回到了主線程更新UI");
}];
}];
~~~
##### 4.沙盒緩存幾個文件件及其作用
沙盒默認下有三個目錄文件夾 documents,Library,tmp
documents:
一般用來存放應用中建立的文件,如數據庫文件,或程序中瀏覽到的文件數據。如果進行備份會將此文件夾中。
`Library `
存儲應用的默認設置及狀態信息
`library/cache `
用來存放緩存文件,此文件夾下數據在應用退出是不會刪除。備份時不會包括
tmp:存放臨時文件
#### 多線程補充
##### 1.SDWebImage 的使用.
~~~
[self.imageView sd_setImageWithURL:[NSURL URLWithString:@""] placeholderImage:[UIImage imageNamed:@""]];
~~~
##### 2.學習如何使用一個三方框架
SDWebImage
上github,下載demo,查看demo
##### 3.了解sdWebImage的底層實現原理
這個需要自己發揮,能講出來多少就多少
##### 4.NSCache和NSMutableDictionary的區別?
NSCache是線程安全的,在viewdidReceviedMemory中清除的內存,NSCache不能再次重新添加。可以設置緩存策略!