最近公司項目不怎麼忙, 閒暇時間把iOS 在面試中可能會遇到的問題整理了一番, 一部分題目是本身面試遇到的,一部分題目則是網上收錄的, 方便本身鞏固複習, 也分享給你們! 知識點比較多,比較雜,這裏作了分類,下面是分類連接地址;前端
面試知識點整理 - 目錄:
iOS | 面試知識整理 - OC基礎 (一)
iOS | 面試知識整理 - OC基礎 (二)
iOS | 面試知識整理 - OC基礎 (三)
iOS | 面試知識整理 - UI 相 關 (四)
iOS | 面試知識整理 - 內存管理 (五)
iOS | 面試知識整理 - 多 線 程 (六)
iOS | 面試知識整理 - 網絡相關 (七)
iOS | 面試知識整理 - 數據持久化 (八)
iOS | 面試知識整理 - Swift 基礎 (九)java
xcode能夠識別一下幾種擴展名文件:ios
Swift 調用 OC代碼
須要建立一個 Target-BriBridging-Header.h
的橋文件,在喬文件導入須要調用的OC代碼頭文件便可git
OC 調用 Swift代碼
直接導入 Target-Swift.h
文件便可, Swift若是須要被OC調用,須要使用@objc 對方法或者屬性進行修飾github
Foundation
對象是OC的,在MRC下須要手動管理內存,ARC下不須要手動管理Core Foundation
對象是C對象, MRC和ARC都須要手動管理內存Swift 是一門新型語言,借鑑了JS,Python,C#,Ruby
等語言特性,看上去偏腳本化,Swift 仍支持 cocoa touch
框架web
優勢:面試
委託是協議的一種,顧名思義,就是委託他人幫本身去作什麼事。編程
delegate:json
在IOS應用開發中有一個」Notification Center「
的概念。它是一個單例對象,容許當事件發生時通知一些對象。後端
notification:
KVO是一個對象可以觀察另一個對象的屬性的值,而且可以發現值的變化。
KVO:
三種模式都是一個對象傳遞事件給另一個對象,而且不要他們有耦合。
三者各有本身的特色:
我的理解: 參考現有的通知中心
靜態庫:以.a 和 .framework爲文件後綴名。
動態庫:以.tbd(以前叫.dylib) 和 .framework 爲文件後綴名。
靜態庫:連接時會被完整的複製到可執行文件中,被屢次使用就有多份拷貝。
動態庫:連接時不復制,程序運行時由系統動態加載到內存,系統只加載一次,多個程序共用(如系統的UIKit.framework等),節省內存。
// 靜態庫.a 和 framework區別.a 主要是二進制文件,不包含資源,須要本身添加頭文件
.framework 能夠包含頭文件+資源信息
優勢:
缺點:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *url = request.URL.absoluteString;
if ([url rangeOfString:@"須要跳轉源生界面的URL判斷"].location != NSNotFound) {
//跳轉原生界面
return NO;
}
return YES;
}
複製代碼
- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
複製代碼
1. 設置 webViewBridge
_bridge = [WKWebViewJavascriptBridge bridgeForWebView:self.webView];
[_bridge setWebViewDelegate:self];
2. 註冊handler方法,須要和 前段協商好 方法名字,是供 JS調用Native 使用的。
[_bridge registerHandler:@"scanClick" handler:^(id data, WVJBResponseCallback responseCallback) {
// OC調用
NSString *scanResult = @"http://www.baidu.com";
// js 回調傳參
responseCallback(scanResult);
}];
3. OC掉用JS
[_bridge callHandler:@"testJSFunction" data:@"一個字符串" responseCallback:^(id responseData) {
NSLog(@"調用完JS後的回調:%@",responseData);
}];
複製代碼
// 直接運行 使用
NSString *jsStr = @"執行的JS代碼";
[webView stringByEvaluatingJavaScriptFromString:jsStr];
// 使用JavaScriptCore框架
#import <JavaScriptCore/JavaScriptCore.h>
- (void)webViewDidFinishLoad:(UIWebView *)webView {
//獲取webview中的JS內容
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
NSString *runJS = @"執行的JS代碼";
//準備執行的JS代碼
[context evaluateScript:runJS];
}
複製代碼
BAD_ACCESS 報錯屬於內存訪問錯誤,會致使程序崩潰,錯誤的緣由是訪問了野指針(懸掛指針)。
函數式編程是一種編程模型,他將計算機運算看作是數學中函數的計算,而且避免了狀態以及變量的概念。函數式編程就像流水線同樣,一順順的把問題解決完,從一個起點開始,一個個的調用函數,由於上一個函數有返回值是工具類自己,因此一個函數執行完以後,能夠用上一個函數繼續調用,有點鏈式思惟在裏面。
Masonry 就是咱們最多見的函數式編程,經過對象.方法1().方法2.....
[view mas_makeConstraints:^(MASConstraintMaker *make){
make.top.bottom.left.right.equalTo(self.view);
}];
複製代碼
鏈式編程?
Block是爲了解決什麼問題而使用的? 我的認爲:
App Thinning
能夠譯成「應用瘦身」。指的是App store 和操做系統在安裝iOS或者watchOS的 app 的時候經過一些列的優化,儘量減小安裝包的大小,使得 app 以最小的合適的大小被安裝到你的設備上。而這個過程包括了三個過程:slicing, bitcode, and on-demand resources。
NSDictionary(字典)是使用 hash表來實現key和value之間的映射和存儲的,hash函數設計的好壞影響着數據的查找訪問效率。
Objective-C 中的字典 NSDictionary 底層實際上是一個哈希表,實際上絕大多數語言中字典都經過哈希表實現,
哈希表的本質是一個數組,數組中每個元素稱爲一個箱子(bin),箱子中存放的是鍵值對。數組長度即箱子數。
哈希表還有一個重要的屬性: 負載因子(load factor),它用來衡量哈希表的 空/滿 程度,必定程度上也能夠體現查詢的效率,計算公式爲:
負載因子 = 總鍵值對數 / 箱子個數
負載因子越大,意味着哈希表越滿,越容易致使衝突,性能也就越低。所以,通常來講,當負載因子大於某個常數(多是 1,或者 0.75 等)時,哈希表將自動擴容。
參考: https://www.jianshu.com/p/88dfc8f405ab
複製代碼
@property (nonatomic, strong) NSMutableArray *arr;
//添加元素操做
[[self mutableArrayValueForKey:@"arr"] addObject:item];
//移除元素操做
[[self mutableArrayValueForKey:@"arr"] removeObjectAtIndex:0];
複製代碼
* Objective,Swift都是編譯語言。編譯語言在執行的時候,必須先經過編譯器生成機器碼,機器碼能夠直接在CPU上執行,因此執行效率較高。Objective,Swift兩者的編譯都是依賴於Clang + LLVM. OC和Swift由於原理上大同小異,知道一個便可!
* iOS編譯 無論是OC仍是Swift,都是採用Clang做爲編譯器前端,LLVM(Low level vritual machine)做爲編譯器後端。
* 編譯器前端 :編譯器前端的任務是進行:語法分析,語義分析,生成中間代碼(intermediate representation )。在這個過程當中,會進行類型檢查,若是發現錯誤或者警告會標註出來在哪一行
* 編譯器後端 :編譯器後端會進行機器無關的代碼優化,生成機器語言,而且進行機器相關的代碼優化。LVVM優化器會進行BitCode的生成,連接期優化等等,LLVM機器碼生成器會針對不一樣的架構,好比arm64等生成不一樣的機器碼。
複製代碼
在團隊協做開發當中,因爲每一個團隊成員的水平不一,很難控制代碼的質量,保證代碼的健壯性,常常會發生因爲後臺返回異常數據形成app崩潰閃退的狀況,爲了不這樣的狀況項目中作一些容錯處理,顯得格外重要,極大程度上下降了由於數據容錯不到位產生崩潰閃退的機率。
例如:
1.字典
2.數組;
3.野指針;
4.NSNull
等~
// AvoidCrash github 三方不錯
複製代碼
例:
一、category給類添加方法用來替換掉本來存在潛在崩潰的方法。
二、利用runtime方法交換技術,將系統方法替換成類添加的新方法。
三、利用異常的捕獲來防止程序的崩潰,而且進行相應的處理。
四、使用 @try__Catch__方法進行攔截
總結:
一、不要過度相信服務器返回的數據會永遠的正確。
二、在對數據處理上,要進行容錯處理,進行相應判斷以後再處理數據,這是一個良好的編程習慣。
Objective-C 異常機制 :
-- 做用 : 開發者將引起異常的代碼放在 @try 代碼塊中, 程序出現異常 使用 @catch 代碼塊進行捕捉;
-- 每一個代碼塊做用 : @try 代碼塊存放可能出現異常的代碼, @catch 代碼塊 異常處理邏輯, @finally 代碼塊回收資源;
-- 語法示例 :
try{
//..執行的代碼,其中可能有異常。一旦發現異常,則當即跳到catch執行。不然不會執行catch裏面的內容
}catch(){
//...除非try裏面執行代碼發生了異常,不然這裏的代碼不會執行
}finally{
//..無論什麼狀況都會執行,包括try catch 裏面用了return ,能夠理解爲只要執行了try或者catch,就必定會執行 finally
}
能夠用於查找 bug,或者調試,防止崩潰使用
複製代碼
單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。
1. 單元測試能夠進行 邏輯測試/異步測試/性能測試
2. 單元測試是以代碼測試代碼。不是靠 NSLog 來測試,而是使用斷言來測試的,提早預判條件必須知足。XCTAssert(條件, 不知足條件的描述)
3. 能夠在單元測試類中編寫單獨的測試用例方法。這些方法與普通的方法相似,可是方法名稱必須以 test 開頭,且不能有參數,否則不會識別爲測試方法。
4. 不是全部的方法都須要測試。例如私有方法不須要測試,只有暴露在 .h 中的方法須要測試。
通常而言,代碼的覆蓋度大概在 50% ~ 70%。從 github 上得知:YYModel 測試覆蓋度爲 83%,AFNetworking 測試覆蓋度爲 77%,二者都是比較高的。
總結: 單元測試能夠根據項目須要,針對一些關鍵業務,編寫一些測試用例,能夠方便的排查業務邏輯可能出現的問題.在後續改動時候也能夠方便的測試等等.
複製代碼
Xcode3 之前: GCC;
Xcode3: 增長LLVM,GCC(前端) + LLVM(後端);
Xcode4.2: 出現Clang - LLVM 3.0成爲默認編譯器;
Xcode4.6: LLVM 升級到4.2版本;
Xcode5: GCC被廢棄,新的編譯器是LLVM 5.0,從GCC過渡到Clang-LLVM的時代正式完成
複製代碼
相同點:
不一樣點:
iOS 構建時產生的符號表,是內存地址、函數名、文件名和行號的映射表。格式大概是:
<起始地址> <結束地址> <函數> [<文件名:行號>]
複製代碼
Crash 時的堆棧信息,全是二進制的地址信息。若是利用這些二進制的地址信息來定位問題是不可能的,所以咱們須要將這些二進制的地址信息還原成源代碼種的函數以及行號,這時候符號表就起做用了。利用符號表將原始的 Crash 的二進制堆棧信息還原成包含行號的源代碼文件信息,能夠快速定位問題。iOS 中的符號表文件(DSYM) 是在編譯源代碼後,處理完 Asset Catalog 資源和 info.plist 文件後開始生成,生成符號表文件(DSYM)以後,再進行後續的連接、打包、簽名、校驗等步驟。
App Thinning「應用瘦身」,iOS9以後發佈的新特性。它能對App store 和操做系統在安裝iOS app 的時候經過一些列的優化,儘量減小安裝包的大小,使得 app 以最小的合適的大小被安裝到你的設備上。而這個過程包括了三個過程:slicing, bitcode, on-demand resources,
* slicing
appStore 會根據用戶的設備型號建立相應的應用變體,這些變體只包含可執行的結構和資源必要部分,不須要用戶下載完整的安裝包
* bitcode
bitcode系統會對編譯後的二進制文件進行二次優化, 使用最新的編譯器自動編譯app而且針對特定架構進行優化。不會下載應用針對不一樣架構的優化,而僅下載與特定設備相關的優化,使得下載量更小,
* On Demand Resources
按需加載資源是在 app 第一次安裝後可下載的文件。舉例說明,當玩家解鎖遊戲的特定關卡後能夠下載新關卡(和這個關卡相關的特定內容)。此外,玩家已經經過的關卡能夠被移除以便節約設備上的存儲空間。
複製代碼
埋點是什麼? 用戶行爲統計,俗稱埋點
埋點分爲兩種:
無痕埋點(自動埋點)解決方案:
技術原理:Method-Swizzling
對於一個給定的事件,UIControl會調用sendAction:to:forEvent:來將行爲消息轉發到UIApplication對象,再由UIApplication對象調用其sendAction:to:fromSender:forEvent:方法來將消息分發到指定的target上,那麼,咱們寫一個UIControl的類別,經過替換它的sendAction:to:forEvent:方法,結合本地配置的埋點json或者plist文件(若埋點須要額外的參數,須要給UIControl的類別經過Runtime添加屬性),即可以實現自動埋點的功能。
參考連接:
www.jianshu.com/p/b8a67c4ac…
www.jianshu.com/p/ae8d45e10…
Apple push Notification Service
,簡稱 APNS
,是蘋果的遠程消息推送,原理以下:
deviceToken
其實呢做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是個人微信 你們有興趣能夠添加 邀請小夥伴們進入微信羣裏一塊兒 交流(想要進入的可加小編微信17512010526)
做者:LEON_iOS
連接:www.jianshu.com/p/2057f9663…