1>.多線程+網絡面試
2>.項目(簡歷上的項目,每個細節:技術實現細節、業務、項目週期、人數)安全
3>.性能優化:圖片優化、內存優化(tableView的循環利用)性能優化
4>.常見的小操做:發佈程序、真機調試、推送網絡
5>.OC:內存管理(重點,ARC與非ARC區別)、語法細節、偏僻的語法多線程
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];
2>NSThread實現
// 優勢:在全部的多線程實現方式中 最輕量級 // 能夠按照需求 任意控制thread對象 即:線程的加鎖等操做 // 缺點:控制太繁瑣 不能本身控制線程安全 // NSThread 的一個對象 就表明一個線程 NSThread *thread = [[NSThread alloc]initWithTarget:selfselector:@selector(btnUpClicked:)object:nil]; [thread start]; [thread release];
// 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:^{ // 填寫你要執行的任務內容 }];
@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
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]; // 優勢:可以本身管理 線程安全 可以合理的安排線程 下降系統的開銷 提升對線程的利用率 // 缺點:可讀性差 寫起來比較繁瑣
5>GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) ,^{ //下載圖片 dispatch_async(dispatch_get_main_queue(),^{ //回到主線程 }); });
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];
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