【2018年最新】 iOS面試題及答案(二)

#####一、HomeKit? 是蘋果2014年發佈的智能家居平臺。objective-c

#####二、什麼是 OpenGL、Quartz 2D?數據庫

Quatarz 2d 是Apple提供的基本圖形工具庫。只是適用於2D圖形的繪製。 OpenGL,是一個跨平臺的圖形開發庫。適用於2D和3D圖形的繪製。編程

#####三、ffmpeg框架? ​ffmpeg 是音視頻處理工具,既有音視頻編碼解碼功能,又能夠做爲播放器使用。設計模式

#####四、談談 UITableView 的優化緩存

1). 正確的複用cell。 2). 設計統一規格的Cell 3). 提早計算並緩存好高度(佈局),由於heightForRowAtIndexPath:是調用最頻繁的方法; 4). 異步繪製,遇到複雜界面,遇到性能瓶頸時,可能就是突破口; 4). 滑動時按需加載,這個在大量圖片展現,網絡加載的時候很管用! 5). 減小子視圖的層級關係 6). 儘可能使全部的視圖不透明化以及作切圓操做。 7). 不要動態的add 或者 remove 子控件。最好在初始化時就添加完,而後經過hidden來控制是否顯示。 8). 使用調試工具分析問題。bash

#####五、如何實行cell的動態的行高微信

若是但願每條數據顯示自身的行高,必須設置兩個屬性,1.預估行高,2.自定義行高。 設置預估行高 tableView.estimatedRowHeight = 200。 設置定義行高 tableView.estimatedRowHeight = UITableViewAutomaticDimension。 若是要讓自定義行高有效,必須讓容器視圖有一個自下而上的約束。網絡

#####六、說說你對 block 的理解多線程

棧上的自動複製到堆上,block 的屬性修飾符是 copy,循環引用的原理和解決方案。閉包

#####七、說說你對 runtime 的理解

主要是方法調用時如何查找緩存,如何找到方法,找不到方法時怎麼轉發,對象的內存佈局。

#####八、什麼是野指針、空指針?

野指針:不知道指向了哪裏的指針叫野指針。即指針指向不肯定,指針存的地址是一個垃圾值,未初始化。 空指針:不指向任何位置的指針叫空指針。即指針沒有指向,指針存的地址是一個空地址,NULL。

#####九、什麼是 OOA / OOD / OOP ? OOA(Object Oriented Analysis) --面向對象分析 OOD(Object Oriented Design) --面向對象設計 OOP(Object Oriented Programming)--面向對象編程

#####10. 多線程是什麼

多線程是個複雜的概念,按字面意思是同步完成多項任務,提升了資源的使用效率,從硬件、操做系統、應用軟件不一樣的角度去看,多線程被賦予不一樣的內涵,對於硬件,如今市面上多數的CPU都是多核的,多核的CPU運算多線程更爲出色;從操做系統角度,是多任務,如今用的主流操做系統都是多任務的,能夠一邊聽歌、一邊寫博客;對於應用來講,多線程可讓應用有更快的迴應,能夠在網絡下載時,同時響應用戶的觸摸操做。在iOS應用中,對多線程最初的理解,就是併發,它的含義是原來先作燒水,再摘菜,再炒菜的工做,會變成燒水的同時去摘菜,最後去炒菜。

#####11. iOS 中的多線程

iOS中的多線程,是Cocoa框架下的多線程,經過Cocoa的封裝,可讓咱們更爲方便的使用線程,作過C++的同窗可能會對線程有更多的理解,好比線程的創立,信號量、共享變量有認識,Cocoa框架下會方便不少,它對線程作了封裝,有些封裝,可讓咱們建立的對象,自己便擁有線程,也就是線程的對象化抽象,從而減小咱們的工程,提供程序的健壯性。

  • GCD是(Grand Central Dispatch)的縮寫 ,從系統級別提供的一個易用地多線程類庫,具備運行時的特色,能充分利用多核心硬件。GCD的API接口爲C語言的函數,函數參數中多數有Block,關於Block的使用參看這裏,爲咱們提供強大的「接口」,對於GCD的使用參見本文

  • NSOperation與Queue

NSOperation是一個抽象類,它封裝了線程的細節實現,咱們能夠經過子類化該對象,加上NSQueue來同面向對象的思惟,管理多線程程序。具體可參看這裏:一個基於NSOperation的多線程網絡訪問的項目。

  • NSThread

NSThread是一個控制線程執行的對象,它不如NSOperation抽象,經過它咱們能夠方便的獲得一個線程,並控制它。但NSThread的線程之間的併發控制,是須要咱們本身來控制的,能夠經過NSCondition實現。 參看 iOS多線程編程之NSThread的使用 其餘多線程 在Cocoa的框架下,通知、Timer和異步函數等都有使用多線程,(待補充).

#####12. 在項目何時選擇使用GCD,何時選擇NSOperation?

項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。

項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。

#####13 KVO,NSNotification,delegate及block區別

  • KVO就是cocoa框架實現的觀察者模式,通常同KVC搭配使用,經過KVO能夠監測一個值的變化,好比View的高度變化。是一對多的關係,一個值的變化會通知全部的觀察者。

  • NSNotification是通知,也是一對多的使用場景。在某些狀況下,KVO和NSNotification是同樣的,都是狀態變化以後告知對方。NSNotification的特色,就是須要被觀察者先主動發出通知,而後觀察者註冊監聽後再來進行響應,比KVO多了發送通知的一步,可是其優勢是監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。

  • delegate 是代理,就是我不想作的事情交給別人作。好比狗須要吃飯,就經過delegate通知主人,主人就會給他作飯、盛飯、倒水,這些操做,這些狗都不須要關心,只須要調用delegate(代理人)就能夠了,由其餘類完成所須要的操做。因此delegate是一對一關係。

  • block是delegate的另外一種形式,是函數式編程的一種形式。使用場景跟delegate同樣,相比delegate更靈活,並且代理的實現更直觀。

  • KVO通常的使用場景是數據,需求是數據變化,好比股票價格變化,咱們通常使用KVO(觀察者模式)。

  • delegate通常的使用場景是行爲,需求是須要別人幫我作一件事情,好比買賣股票,咱們通常使用delegate。

  • Notification通常是進行全局通知,好比利好消息一出,通知你們去買入。

  • delegate是強關聯,就是委託和代理雙方互相知道,你委託別人買股票你就須要知道經紀人,經紀人也不要知道本身的顧客。

  • Notification是弱關聯,利好消息發出,你不須要知道是誰發的也能夠作出相應的反應,同理發消息的人也不須要知道接收的人也能夠正常發出消息。

#####14 將一個函數在主線程執行的4種方法

  • GCD方法,經過向主線程隊列發送一個block塊,使block裏的方法能夠在主線程中執行。
dispatch_async(dispatch_get_main_queue(), ^{      
    //須要執行的方法
});
複製代碼
  • NSOperation 方法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];  //主隊列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
	//須要執行的方法
}];
[mainQueue addOperation:operation];
複製代碼
  • NSThread 方法
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil];

[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];

[[NSThread mainThread] performSelector:@selector(method) withObject:nil];
RunLoop方法
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];
複製代碼
  • RunLoop方法
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];
複製代碼

#####1五、 如何讓計時器調用一個類方法

  • 計時器只能調用實例方法,可是能夠在這個實例方法裏面調用靜態方法。
  • 使用計時器須要注意,計時器必定要加入RunLoop中,而且選好model才能運行。scheduledTimerWithTimeInterval方法建立一個計時器並加入到RunLoop中因此能夠直接使用。
  • 若是計時器的repeats選擇YES說明這個計時器會重複執行,必定要在合適的時機調用計時器的invalid。不能在dealloc中調用,由於一旦設置爲repeats 爲yes,計時器會強持有self,致使dealloc永遠不會被調用,這個類就永遠沒法被釋放。好比能夠在viewDidDisappear中調用,這樣當類須要被回收的時候就能夠正常進入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];

-(void)timerMethod
{
//調用類方法
	[[self class] staticMethod];
}

-(void)invalid
{
	[timer invalid];
	timer = nil;
}
複製代碼

#####1六、 如何重寫類方法

一、在子類中實現一個同基類名字同樣的靜態方法 二、在調用的時候不要使用類名調用,而是使用[self class]的方式調用。原理,用類名調用是早綁定,在編譯期綁定,用[self class]是晚綁定,在運行時決定調用哪一個方法。

#####1七、 NSTimer建立後,會在哪一個線程運行。

用scheduledTimerWithTimeInterval建立的,在哪一個線程建立就會被加入哪一個線程的RunLoop中就運行在哪一個線程 本身建立的Timer,加入到哪一個線程的RunLoop中就運行在哪一個線程。

#####1八、 id和NSObject*的區別

id是一個 objc_object 結構體指針,定義是

typedef struct objc_object *id
複製代碼
  • id能夠理解爲指向對象的指針。全部oc的對象 id均可以指向,編譯器不會作類型檢查,id調用任何存在的方法都不會在編譯階段報錯,固然若是這個id指向的對象沒有這個方法,該崩潰仍是會崩潰的。

  • NSObject *指向的必須是NSObject的子類,調用的也只能是NSObjec裏面的方法不然就要作強制類型轉換。

  • 不是全部的OC對象都是NSObject的子類,還有一些繼承自NSProxy。NSObject *可指向的類型是id的子集。

#####1九、淺談iOS開發中方法延遲執行的幾種方式?

  • Method1. performSelector方法
  • Method2. NSTimer定時器
  • Method3. NSThread線程的sleep
  • Method4. GCD
公用延遲執行方法:
- (void)delayMethod{ 
      NSLog(@"delayMethodEnd");
}
複製代碼

######Method1:performSelector

[self performSelector:@selector(delayMethod) withObject:nil]
複製代碼

可傳任意類型參數/ afterDelay:2.0]; 注:此方法是一種非阻塞的執行方式,未找到取消執行的方法。

程序運行結束 2015-08-31 10:56:59.361 CJDelayMethod[1080:39604] delayMethodStart2015-08-31 10:56:59.363 CJDelayMethod[1080:39604] nextMethod2015-08-31 10:57:01.364 CJDelayMethod[1080:39604] delayMethodEnd

Method2:NSTimer定時器
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
複製代碼

注:此方法是一種非阻塞的執行方式, 取消執行方法:- (void)invalidate;便可

程序運行結束 2015-08-31 10:58:10.182 CJDelayMethod[1129:41106] delayMethodStart2015-08-31 10:58:10.183 CJDelayMethod[1129:41106] nextMethod2015-08-31 10:58:12.185 CJDelayMethod[1129:41106] delayMethodEnd

Method3:NSThread線程的sleep
[NSThread sleepForTimeInterval:2.0];
複製代碼

注:此方法是一種阻塞執行方式,建議放在子線程中執行,不然會卡住界面。但有時仍是須要阻塞執行,如進入歡迎界面須要沉睡3秒才進入主界面時。 沒有找到取消執行方式。

程序運行結束 2015-08-31 10:58:41.501 CJDelayMethod[1153:41698] delayMethodStart2015-08-31 10:58:43.507 CJDelayMethod[1153:41698] nextMethod

Method4:GCD
__block ViewController/*主控制器*/ *weakSelf = self;
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0/*延遲執行時間*/ * NSEC_PER_SEC));

dispatch_after(delayTime, dispatch_get_main_queue(), ^{
    [weakSelf delayMethod];
});`
複製代碼

注:此方法能夠在參數中選擇執行的線程,是一種非阻塞執行方式。沒有找到取消執行方式。

程序運行結束 2015-08-31 10:59:21.652 CJDelayMethod[1181:42438] delayMethodStart2015-08-31 10:59:21.653 CJDelayMethod[1181:42438] nextMethod2015-08-31 10:59:23.653 CJDelayMethod[1181:42438] delayMethodEnd

#####20、NSPersistentStoreCoordinator , NSManaged0bjectContext 和NSManaged0bject中的那些須要在線程中建立或者傳遞?

答:NSPersistentStoreCoordinator是持久化存儲協調者,主要用於協調託管對象上下文和持久化存儲區之間的關係。NSManagedObjectContext使用協調者的託管對象模型將數據保存到數據庫,或查詢數據。

#####20、您是否作過一部的網絡處理和通信方面的工做?若是有,能具體介紹一下實現策略麼

答:使用NSOperation發送異步網絡請求,使用NSOperationQueue管理線程數目及優先級,底層是用NSURLConnetion,

#####2一、你使用過Objective-C的運行時編程(Runtime Programming)麼?若是使用過,你用它作了什麼?你還能記得你所使用的相關的頭文件或者某些方法的名稱嗎?

答:Objecitve-C的重要特性是Runtime(運行時),在#import <objc/runtime.h> 下能看到相關的方法,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用

Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);  
複製代碼

代碼交換兩個方法,在寫unit test時使用到。

#####2二、Core開頭的系列的內容。是否使用過CoreAnimation和CoreGraphics。UI框架和CA,CG框架的聯繫是什麼?分別用CA和CG作過些什麼動畫或者圖像上的內容。(有須要的話還能夠涉及Quartz的一些內容)

答:UI框架的底層有CoreAnimation,CoreAnimation的底層有CoreGraphics。

UIKit
Core Animation
Core Graphics
Graphics Hardware

#####2三、是否使用過CoreText或者CoreImage等?若是使用過,請談談你使用CoreText或者CoreImage的體驗。

答:CoreText能夠解決複雜文字內容排版問題。CoreImage能夠處理圖片,爲其添加各類效果。體驗是很強大,挺複雜的。

#####24.NSNotification和KVO的區別和用法是什麼?何時應該使用通知,何時應該使用KVO,它們的實現上有什麼區別嗎?若是用protocol和delegate(或者delegate的Array)來實現相似的功能可能嗎?若是可能,會有什麼潛在的問題?若是不能,爲何?

答:NSNotification是通知模式在iOS的實現, KVO的全稱是鍵值觀察(Key-value observing),其是基於KVC(key-value coding)的,KVC是一個經過屬性名訪問屬性變量的機制。例如將Module層的變化,通知到多個Controller對象時,可使用NSNotification;若是是隻須要觀察某個對象的某個屬性,可使用KVO。 對於委託模式,在設計模式中是對象適配器模式,其是delegate是指向某個對象的,這是一對一的關係,而在通知模式中,每每是一對多的關係。委託模式,從技術上能夠如今改變delegate指向的對象,但不建議這樣作,會讓人迷惑,若是一個delegate對象不斷改變,指向不一樣的對象。

#####2五、你用過NSOperationQueue麼?若是用過或者瞭解的話,你爲何要使用NSOperationQueue,實現了什麼?請描述它和G.C.D的區別和相似的地方(提示:能夠從二者的實現機制和適用範圍來描述)。

答:使用NSOperationQueue用來管理子類化的NSOperation對象,控制其線程併發數目。GCD和NSOperation均可以實現對線程的管理,區別是 NSOperation和NSOperationQueue是多線程的面向對象抽象。項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。 項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。

#####2六、既然提到G.C.D,那麼問一下在使用G.C.D以及block時要注意些什麼?它們兩是一回事兒麼?block在ARC中和傳統的MRC中的行爲和用法有沒有什麼區別,須要注意些什麼?

答:使用block是要注意,若將block作函數參數時,須要把它放到最後,GCD是Grand Central Dispatch,是一個對線程開源類庫,而Block是閉包,是可以讀取其餘函數內部變量的函數。

#####2七、對於Objective-C,你認爲它最大的優勢和最大的不足是什麼?對於不足之處,如今有沒有可用的方法繞過這些不足來實現需求。若是能夠的話,你有沒有考慮或者實踐太重新實現OC的一些功能,若是有,具體會如何作?

答:最大的優勢是它的運行時特性,不足是沒有命名空間,對於命名衝突,可使用長命名法或特殊前綴解決,若是是引入的第三方庫之間的命名衝突,可使用link命令及flag解決衝突。

#####2八、你實現過一個框架或者庫以供別人使用麼?若是有,請談一談構建框架或者庫時候的經驗;若是沒有,請設想和設計框架的public的API,並指出大概須要如何作、須要注意一些什麼方面,來使別人容易地使用你的框架。

答:抽象和封裝,方便使用。首先是對問題有充分的瞭解,好比構建一個文件解壓壓縮框架,從使用者的角度出發,只需關注發送給框架一個解壓請求,框架完成複雜文件的解壓操做,而且在適當的時候通知給是哦難過者,如解壓完成、解壓出錯等。在框架內部去構建對象的關係,經過抽象讓其更爲健壯、便於更改。其次是API的說明文檔。


qq技術交流羣

qq交流羣.jpeg
做者微信公衆號
微信公衆號.jpg
相關文章
相關標籤/搜索