ios 面試題 0

1.__block和__weak修飾符的區別: xcode

  1.__block不論是ARC仍是MRC模式下均可以使用,能夠修飾對象,還能夠修飾基本數據類型。 
  2.__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。 
  3.__block對象能夠在block中被從新賦值,__weak不能夠。 瀏覽器

2.tableView 滑動卡的問題緩存

 主要是由於從緩存中或者是從本地讀取圖片給UIImage的時候耗費了時間。須要把下面的兩句話放到子線程裏面:服務器

    1.   NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //獲得圖像數據  
    2.      UIImage *image = [UIImage imageWithData:imgData];  

把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

一、assign: 簡單賦值,不更改索引計數;
二、assign的狀況:NSString *newPt = [pt assing]; 
此時newPt和pt徹底相同 地址都是0Xaaaa 內容爲0X1111 即newPt只是pt的別名,對任何一個操做就等於對另外一個操做, 所以retainCount不須要增長;
三、assign就是直接賦值;
四、retain使用了引用計數,retain引發引用計數加1, release引發引用計數減1,當引用計數爲0時,dealloc函數被調用,內存被回收;    
五、retain的狀況:NSString *newPt = [pt retain]; 
此時newPt的地址再也不爲0Xaaaa,可能爲0Xaabb 可是內容依然爲0X1111。 所以newPt 和 pt 均可以管理"abc"所在的內存,所以 retainCount須要增長1 ;
12.readonly
屬性是隻讀的,默認的標記是讀寫,若是你指定了只讀,在@implementation中只須要一個讀取器。或者若是你使用@synthesize關鍵字,也是有讀取器方法被解析
13.readwrite:
說明屬性會被當成讀寫的,這也是默認屬性。設置器和讀取器都須要在@implementation中實現。若是使用@synthesize關鍵字,讀取器和設置器都會被解析;
14.nonatomic:
非原子性訪問,對屬性賦值的時候不加鎖,多線程併發訪問會提升性能。若是不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問;
15.weak and strong property (強引用和弱引用的區別):
一、 weak 和 strong 屬性只有在你打開ARC時纔會被要求使用,這時你是不能使用retain release autorelease 操做的,由於ARC會自動爲你作好這些操做,可是你須要在對象屬性上使用weak 和strong,其中strong就至關於retain屬性,而weak至關於assign。
二、只有一種狀況你須要使用weak(默認是strong),就是爲了不retain cycles(就是父類中含有子類{父類retain了子類},子類中又調用了父類{子類又retain了父類},這樣都沒法release)    
三、聲明爲weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值爲nil。這樣的好處能有效的防止野指針。
16. ARC(Automatic Reference Counting):
就是代碼中自動加入了retain/release,原先須要手動添加的用來處理內存管理的引用計數的代碼能夠自動地由編譯器完成了。
該機能在 iOS 5/ Mac OS X 10.7 開始導入,利用 Xcode4.2 之後可使用該特性。
17.strong,weak,copy 具體用法: strong,weak,copy 具體用法:
1.具體一點:IBOutlet能夠爲weak,NSString爲copy,Delegate通常爲weak,其餘的看狀況。通常來講,類「內部」的屬性設置爲strong,類「外部」的屬性設置爲weak。說到底就是一個歸屬權的問題。當心出現循環引用致使內存沒法釋放。
2.不用ARC的話就會看到不少retian。
3.若是你寫了@synthesize abc = _abc;的話,系統自動幫你聲明瞭一個_abc的實例變量。
   使用assign: 對基礎數據類型 (NSInteger)和C數據類型(int, float, double, char,等)
   使用copy: 對NSString  
 使用retain: 對其餘NSObject和其子類 
18.寫一個NSString類的實現

+ (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.線程與進程的區別和聯繫? 

進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。 

程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。

相關文章
相關標籤/搜索