1. 你在開發程序中常用到哪些定時器,定時器時間會有誤差嗎,如果有,為什么會有誤差?
iOS中常NSTimer、CADisplayLink、GCD定時器,其中NSTimer、CADisplayLink基于NSRunLoop實作,故存在誤差,GCD定時器只依賴系統內核,相對一前兩者是比較準時的,
誤差原因是:與NSRunLoop機制有關, 因為RunLoop每跑完一次圈再去檢查當前累計時間是否已經達到定時設定的間隔時間,如果未達到,RunLoop將進入下一輪任務,待任務結束之后再去檢查當前累計時間,而此時的累計時間可能已經超過了定時器的間隔時間,故會存在誤差,
參考《iOS常見三種定時器-NSTimer、CADisplayLink、GCD定時器》
2. NSTimer、CADisplayLink會產生回圈參考嗎?如果會,你是如何解決的?
如果直接使用,會產生回圈參考問題,可以增加一個中間類,給這個類添加一個用weak修飾的id 型別target屬性,并重寫中間類的訊息轉發方法,實作如下代碼:
宣告檔案.h:
#import <Foundation/Foundation.h> @interface LXProxy : NSProxy + (instancetype)proxyWithTarget:(id)target; @end
實作檔案.m
#import "LXProxy.h" @interface LXProxy () /** weak target*/ @property (nonatomic, weak) id target; @end @implementation LXProxy + (instancetype)proxyWithTarget:(id)target{ LXProxy *proxy = [LXProxy alloc]; proxy.target = target; return proxy; } - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel{ return [self.target methodSignatureForSelector:sel]; } - (void)forwardInvocation:(NSInvocation *)invocation{ [invocation invokeWithTarget:self.target]; } @end
呼叫代碼:
_timer = [NSTimer scheduledTimerWithTimeInterval:2 target:[LXProxy proxyWithTarget:self] selector:@selector(test) userInfo:nil repeats:YES];
3. 對Runtime有了解嗎,Runtime的方法查找程序是什么樣的?有哪些實際應用?
runtime是OC動態語言的運行時機制,OC的方法呼叫最后都轉成了runtime的objc_msgSend函式,
3.1 Runtime訊息傳遞:
- 通過哈希演算法,先從方法快取中查找,如果命中,呼叫方法結束流程
- 如果快取中沒有,則去當前類的方法串列中查找,如果命中,呼叫方法,加入當前方法快取中,結束流程
- 如果當前類沒有對應方法,則去逐級父類方法串列中查找,如果命中,呼叫方法,加入當前方法快取中,結束流程
- 如果方法都不存在,進入方法動態決議,轉入訊息轉發流程,
注:對于已經排序好的方法串列,采用二分查演算法查找對應的執行函式,對應沒有排序的串列,采用一般遍歷方法查找對應執行函式,
3.2 訊息轉發流程:
- 呼叫動態決議方法resolveClassMethod:(SEL)sel,如果動態添加方法(呼叫class_addMethod函式)并回傳YES,則結束流程
- 如果上一步沒有實作動態添加方法,無論回傳Yes還是No,都會呼叫訊息接受者重定向forwardingTargetForSelector方法,如果回傳重定向接受者,則當前流程結束
- 如果回傳上一步nil,則會呼叫methodSignatureForSelector獲取函式的引數和回傳值型別,同時呼叫forwardInvocation訊息通知當前物件,
- 如果上一步回傳nil,訊息無法處理,App crash,
3.3 繼承關系:
- 實體物件(isntance)的isa指標指向類物件(class),類物件的存放實體方法(-方法)
- 類物件(class)的isa指標指向其元類物件(meta), 元類物件存放類方法(+方法)
- 根類物件(root class)的isa指標指向根元類物件(root meta),superclass指標指向nil.
- 根元類物件(root meta)的isa指標指向自己,superclass指標根類物件(root class)
由此可知, 實體方法(-方法)查找是沿著其superclass指標逐級父類查找,終于根類物件(root class),而類方法(+方法)查找是沿著其superclass指標逐級父類(meta)查找,終于根類物件(root class),如果根類物件存在同名實體方法,則會呼叫同名實體方法
3.4 Runtime實際運用:
- 給NSTimer定時器宣告一個中間類Proxy(訊息轉發)
- 通過rumtime動態獲取類的所有屬性(json轉model、可歸檔類對屬性的歸檔及解歸檔操作)
- 反射機制(NSClassFromString, CTMediator原理)
- 交換系統方法(比如交換viewController生命周期方法,從而進行統一埋點等操作)
- 給分類添加屬性(通過關聯物件,實作getter, setter方法)
4. +load和+initlize呼叫時機?現在有一個類,給其添加了多個分類,并且每個實作分類都實作了相同的類方法(比如+test),在呼叫這個方法時,會呼叫到哪個分類?
-
+initialize 方法,會在第一次初始化這個類之前被呼叫,我們用它來初始化靜態變數,+load 方法會在加載類的時候就被呼叫,也就是 ios 應用啟動的時候,就會加載所有的類,就會呼叫每個類的 +load 方法,initialize 方法類似一個懶加載,如果沒有使用這個類,那么系統默認不會去呼叫這個方法,且默認只加載一次,且呼叫發生在 +init 方法之前,
-
呼叫最后參與編譯的分類的test方法,原因:Xcode在編譯時根據buildPhases->Compile Sources里面的從上至下順序編譯的,通過壓堆疊的方式將多個分類壓堆疊,且根據后進先出的原則,后編譯的會被先呼叫(插入頂部添加,即[methodLists insertObject:category_method atIndex:0],所以objc_msgSend遍歷方法串列查找SEL 對應的IMP時,會先找到最后參與編譯的分類)當objc_msgSend找到方法并呼叫之后,結束傳遞訊息,所以就形成了所謂的“覆寫”,
5. App冷啟動優化?
App冷啟動優化方案博客非常之多,概括總結大致如下:
- pre-main優化:減少動態靜態庫,合并動態庫,移除廢棄第三方庫及所依賴的系統庫,二進制重排(抖音優化方案)
- runtime對類的注冊,類物件的初始化,load方法加載階段:精簡類,合并分類,移除廢棄分類等等
- main函式之后,推遲對三方庫注冊及延時呼叫耗時操作函式,可以通過Instruments-->Time Profiler: 性能分析,定位耗時函式
6. UIView和CALayer有了解嗎,UI卡頓原因是什么,什么是離屏渲染,為什么會產生離屏渲染,如何避免觸發離屏渲染?
- UIView和CALayer遵循單一職責原則,UIView負責事件處理,參與回應鏈,為CALayer提供顯示的內容,CALayer負責內容顯示,
- UI卡頓原因:參考
3、網路工程面試題
1. HTTPS和HTTP有什么區別,HTTPS加密程序是什么樣的,對稱加密和非對稱解密各有什么優缺點?
HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全
HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊安全通道,來保證資料傳輸的安全;另一種就是確認網站的真實性,
HTTP與HTTPS的區別,詳細介紹
2. TCP和UDP有什么區別,TCP是可靠傳輸嗎,如果保證其可靠性?
2.1 TCP和UDP區別:
- TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送資料之前不需要建立連接
- TCP提供可靠的服務,也就是說,通過TCP連接傳送的資料,無差錯,不丟失,不重復,且按序到達;UDP盡最大努力交付,即不保證可靠交付
- TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流;UDP是面向報文的UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如IP電話,實時視頻會議等)
- 每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的互動通信
- TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
- TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
參考1
2.2 TCP可靠性:
- 校驗和
- 確認應答與序列號
- 超時重傳
- 連接管理
- 流量控制
- 擁塞控制(慢啟動,擁塞避免,快重傳,快恢復)
參考2
3. 如何針對App弱網情況優化
參考:淺談APP弱網優化
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/196118.html
標籤:其他
上一篇:uni-app中IOS離線打包報HBuilder has conflicting provisioning settings
