iOS面試題01-多線程網絡

1.面試題方向:

1>.多線程+網絡面試

2>.項目(簡歷上的項目,每個細節:技術實現細節、業務、項目週期、人數)安全

3>.性能優化:圖片優化、內存優化(tableView的循環利用)性能優化

4>.常見的小操做:發佈程序、真機調試、推送網絡

5>.OC:內存管理(重點,ARC與非ARC區別)、語法細節、偏僻的語法多線程

2.面試題

1.多線程的底層實現?併發

答:1>回答能夠從」多線程「是從哪一個系統中開始使用:Mach是第一個以多線程方式處理任務的系統,異步

所以多線程的底層實現的底層機制是基於Mach的線程async

2.>回答多線程的使用環境:多線程處理包括Core Data的多線程訪問,UI的並行繪製,異步網絡請求ide

以及在運行態內存吃緊的狀況下處理大文件的方案等 函數

3>回答而且舉例說明iOS提供的多線程的實現方法:iOS中提供瞭如下幾種處理多線程的實現方式

1.回答C語言中的POSIX接口,經過導入庫#include <pthread.h>

2.多線程使用方法

1>.NSOBjcet實現

// 最簡單的多線程 執行方式
    // 參數1:須要在後臺(子線程)執行方法
    // 參數2:給這個方法傳參
    [self performSelectorInBackground:@selector(btnUpClicked:)withObject:nil];
View Code

2>NSThread實現

 

// 優勢:在全部的多線程實現方式中  最輕量級
//      能夠按照需求 任意控制thread對象 即:線程的加鎖等操做
// 缺點:控制太繁瑣 不能本身控制線程安全
    // NSThread 的一個對象 就表明一個線程
    NSThread *thread = [[NSThread alloc]initWithTarget:selfselector:@selector(btnUpClicked:)object:nil];
    [thread start];
    [thread release];
View Code

 

3>NSOperation實現

 

// NSOperation表明一個任務 本身不能實現多線程
// NSOperation是一個抽象類 不能直接使用 須要建立一個子類去編寫實現的內容
// 任務開始 會在當前線程執行任務(main方法中的代碼)
 
    MyOperation *operation = [[MyOperation alloc] init];
    [operation start];
    [operation release];
     
    // 系統已經寫好了兩個類 能夠直接使用
//    NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:<#(id)#> selector:<#(SEL)#> object:<#(id)#>]
    NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
            // 填寫你要執行的任務內容
    }];
View Code
@implementation MyOperation
 
- (void)main
{
    // operation在main方法中寫要執行的任務
     
    static int count = 0 ;
     
    for (int i = 0 ; i < 600000000; i ++) {
        count ++;
    }
    NSLog(@"%d", count);
     
    // 判斷當前任務是否爲主線程  0爲不是 1爲是
    BOOL b = [NSThread isMainThread];
    NSLog(@"%d", b);
     
    NSThread *thread = [NSThread currentThread];
    NSLog(@"當前線程爲:%@", thread);
     
}
@end
View Code

4>NSOperationQueue

 // 任務隊列(NSOperationQueue) 內部管理一些列的線程
     
    MyOperation *op1 = [[MyOperation alloc] init];
    MyOperation *op2 = [[MyOperation alloc] init];
    MyOperation *op3 = [[MyOperation alloc] init];
    MyOperation *op4 = [[MyOperation alloc] init];
     
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
     
    // 設置最大併發數
    [queue setMaxConcurrentOperationCount:2];
     
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];
    [queue addOperation:op4];
     
    // 優勢:可以本身管理 線程安全 可以合理的安排線程 下降系統的開銷 提升對線程的利用率
    // 缺點:可讀性差 寫起來比較繁瑣
View Code

 

5>GCD

 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) ,^{
     //下載圖片
     dispatch_async(dispatch_get_main_queue(),^{
         //回到主線程
     });
});   
View Code

 

 2.線程是如何通訊的?

1>回答線程通訊:一條線程回到另一條線程(一個線程數據傳輸到另一條線程 )

 

 

2>線程通訊第一種方法(performSelector,performSelectorOnMainThread)

 

3>.線程通訊第二種方法(NSMarchPort)

 

主線程能夠經過NSMarchPort輸入給子線程NSMarchPort,反之亦可


3.網絡圖片處理問題中怎麼解決一個相同的網絡地址重複請求的問題?

回答:利用字典(圖片地址爲key,下載操做爲value)

4.用NSOperation和NSOpertionQueue處理A,B,C三個線程,要求執行A,B後才能執行C,怎麼作?

回答:

//建立隊列
NSOperationQueue *queue = [[NSOperation alloc]  init];

//建立3個操做
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
       NSLog(@"operation--a");
      
  }];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
       NSLog(@"operation--b");
      
  }];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
       NSLog(@"operation--c");
      
  }];
//添加依賴
[c addDependency:a];
[c addDependency:b];

//執行操做
[queue addOperation:a];
[queue addOperation:b];
View Code

 

5.列舉cocoa 中常見對幾種多線程的實現,並談談多線程安全的幾種解決方法及多線程安全怎麼控制?

回答:1>只在主線程刷新訪問UI

     2>如要要防禦資源搶奪,得用synchronied進行加鎖保護

         3>若是異步操做要保證線程安全等範圍,儘可能使用GCD(有些函數默認是安全的,默認加鎖)

6.GCD內部怎麼實現?

回答:1>iOS的OS X核心是XNU內核,GCD是基於XNU 內核實現的,

         2>GCD的API所有在libdispatch庫中

         3>GCD的底層實現主要有Dispatch Queue和Dispatch Source 

    ~ Dispatch Queue :管理block(操做)

    ~Dispatch Source:處理事件(好比線程通訊)

      GCD的block存放在隊列:底層實現主要存在隊列

7.你用過NSOperationQueue ?若是用過或者瞭解的話,你爲何要用NSOperationQueue實現了什麼?

請描述它和GCD的區別和相似的地方?

回答:1>GCD是純C語言的API, NSOperationQueue是基於 的OC版本封裝

     2>GCD只支持FIFO(先進先出)的隊列,NSOperationQueue能夠很方便地調整執行順序(能夠添加依賴順序執行)設置最大併發數量

     3>NSOperationQueue能夠輕鬆在Operation間設置依賴關係,而GCD須要寫不少的代碼才能實現

         4>NSOperationQueue支持KVO,能夠檢測operation是否正在執行(isExecuted)、是否結束(isFinished)、是否結束(isCanceld) 

     @1.KVC:間接經過字符串類型的key取出對應的屬性值

   KVC的價值:

   #1.能夠訪問私有成員變量的值

   #2.能夠間接修改私有成員變量的值(替換系統自帶的導航欄、tabbar)

        #3.KVC valueForKey與valueForKeyPath區別:

   ^1.valueForKey:只能訪問當前對象的屬性

   ^2.valueForKeyPath:能利用,運算符一層一層往內部訪問屬性

         5>GCD的執行速度比NSOperationQueue快

     任務之間不太互相依賴:GCD

         任務之間有依賴、或者要監放任務的執行狀況:NSOperationQueue

8.提到GCD,那麼 問一下在使用GCD以及block時要注意一些什麼?他們兩是一回事麼?

block在ARC中和傳統的MRC中行爲和用法有沒有什麼區別,須要注意一些什麼?

回答:Block使用注意:

  1>block的內存管理

  

  block進行copy操做後(堆空間對所引用的對象產生一個強引用,對p對象產生一個強引用,就會形成循環引用):

   附:block只要不進行copy操做,block內存永遠在棧內存當中,就不會對所引用對象產生強引用

         block存儲於堆空間,就會對block內部所用到的對象產生強引用

    

   block 進行weak操做後(弱指針引用)  

    

   附:ARC若是block進行copy防止內存泄露可使用 __unsafe_unretained typeof(對象)釋放內存,解決循環引用

    非ARC可使用__block typeof(p) 解決循環引用

      變量前添加__block,傳入地址

  2>防止循環retain

  @非ARC(MRC):_block

  @ARC:_weak/__unsafe_unretained

       block進行copy操做後,對象在,block就存在,

9.在異步線程中下載不少圖片,若是失敗了,該如何處理?請結合RunLoop從新發送網絡請求

回答:1>從新下載圖片

        2>下載完畢,利用RunLoop的輸入源回到主線程刷新UIImageView

相關文章
相關標籤/搜索