1.__block和__weak修飾符的區別: xcode
1.__block不論是ARC仍是MRC模式下均可以使用,能夠修飾對象,還能夠修飾基本數據類型。
2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。
3.__block對象能夠在block中被從新賦值,__weak不能夠。 瀏覽器
2.tableView 滑動卡的問題緩存
主要是由於從緩存中或者是從本地讀取圖片給UIImage的時候耗費了時間。須要把下面的兩句話放到子線程裏面:服務器
把UIImage賦值給圖片的時候在主線程,子線程不能更新UI 全部的UI跟新都是主線程執行了。網絡
3.子線程裏面加入NSTimer不能循環怎麼解決?多線程
手動添加NSRunloop併發
4.單例裏面添加 NSMutableArray 的時候,怎樣防止多個地方對它同時遍歷和修改?app
須要加原子屬性,而且用strong,,,而且寫一個遍歷和修改的方法。加上鎖。 Lock UnLock 異步
5.GCD裏面怎樣 防止內存釋放不了,循環引用 ?socket
__weak ViewController* weakSelf = self;
6.SDWebImage做用與內部實現過程
做用:可使用它做爲圖片異步下載器、圖片自動緩存、支持gif動態圖等,它會保證相同的url圖片資源只下載一次,永遠不會鎖住主線程,同時支持gcd和arc、arm64。總之,使用SDWebImage下載網絡圖片能夠提升各類性能。
實現過程:首先從緩存裏找圖片,有就顯示;若是沒有從磁盤找圖片,若是有,將圖片添加到內存緩存,顯示圖片;若是磁盤沒有就下載圖片,內存和磁盤同時下載,而後顯示到界面。
7.http狀態碼
302 是請求重定向。500以上是服務器錯誤。400以上是請求連接錯誤或者找不到服務器。200以上是正確。100以上是請求接受成功。
8.HTTP Keep-Alive是什麼?如何工做?
在http早期,每一個http請求都要求打開一個tcp socket鏈接,而且使用一次以後就斷開這個tcp鏈接。
使用keep-alive能夠改善這種狀態,即在一次TCP鏈接中能夠持續發送多份數據而不會斷開鏈接。更少的tcp鏈接意味着更少的系統內核調用,socket的accept()和close()調用。
Httpd守護進程,通常都提供了keep-alive timeout時間設置參數。意味着:一個http產生的tcp鏈接在傳送完最後一個響應後,還須要hold住keepalive_timeout秒後,纔開始關閉這個鏈接。
當http的守護進程發送完一個響應後,理應立刻主動關閉相應的tcp鏈接,設置 keep-alive timeout後,httpd守護進程會想說:」再等等吧,看看瀏覽器還有沒有請求過來」,這一等,即是keepalive_timeout時間。若是守護進程在這個等待的時間裏,一直沒有收到瀏覽發過來http請求,則關閉這個http鏈接.
9.GCD的使用
系統給每個應用程序提供了三個concurrent dispatch queues。這三個併發調度隊列是全局的,它們只有優先級的不一樣。由於是全局的,咱們不須要去建立。
1.使用函數dispath_get_global_queue去獲得隊列,系統默認就有一個串行隊列main_queue,以上兩個都是全局的隊列,不用retain或release。
2.dispatch_group_async是異步的方法,能夠實現監聽一組任務是否完成,完成後獲得通知執行其餘的操做。
3.dispatch_barrier_async是在前面的任務執行結束後它才執行,並且它後面的任務等它執行完成以後纔會執行
4.dispatch_apply執行某個代碼片斷N次。
dispatch_apply(5, globalQ, ^(size_t index) {
// 執行5次
});
10.copy與retain:
一、copy實際上是創建了一個相同的對象,而retain不是;
二、copy是內容拷貝,retain是指針拷貝;
三、copy是內容的拷貝 ,對於像NSString,的確是這樣,可是若是copy的是一個NSArray呢?這時只是copy了指向array中相對應元素的指針.這即是所謂的"淺複製".
四、copy的狀況:NSString *newPt = [pt copy];
此時會在堆上從新開闢一段內存存放@"abc" 好比0X1122 內容爲@"abc 同時會在棧上爲newPt分配空間 好比地址:0Xaacc 內容爲0X1122 所以retainCount增長1供newPt來管理0X1122這段內存
11.assign與retain:
+ (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
+ (id) stringWithCString: (c*****t char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
19.static 關鍵字的做用:
(1)函數體內 static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變量的內存只被分配一次,
所以其值在下次調用時仍維持上次的值;
(2)在模塊內的 static 全局變量能夠被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明
它的模塊內;
(4)在類中的 static 成員變量屬於整個類所擁有,對類的全部對象只有一份拷貝;
(5)在類中的 static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,於是只能訪問類的static 成員變量。
20.線程與進程的區別和聯繫?
進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。
程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。