OC
- runtime
- method_swizzled使用和原理:方法的調(diào)用實際上是消息發(fā)送,一個對象收到消息之后會在類的方法列表中(或者緩存列表)中尋找該消息對應(yīng)的method,swizzled就是修改方法列表中的元素,使得method中的imp指針指向交換后的實現(xiàn),從而達(dá)到方法交換的目的。
- category方法覆蓋關(guān)系,為什么不允許新增實例變量
- load和initialize:load方法在文件被裝載時調(diào)用,線程安全,只會被調(diào)用一次,一般用于方法交換。initialize方法會在首次給該類發(fā)送消息時調(diào)用,一般可以用于為不方便在編譯期賦值的靜態(tài)變量賦值。
- kvo
- runloop
- 與多線程的關(guān)系:線程與runloop是一一對應(yīng)的關(guān)系,一個線程最多擁有一個runloop(在非主線程,只有執(zhí)行了獲取函數(shù)才會創(chuàng)建runloop),并且runloop只能在所在的線程獲取(mainRunloop除外)
- 如何獲取fps:由于CADisplayLink與屏幕刷新率一致(60fps),所以將它加入到mainRunloop中,通過計算兩次執(zhí)行的間隔時間即可得到fps。
- 啟動優(yōu)化,記錄+load到第二個main runloop時間間隔計算啟動時間。優(yōu)化啟動鏈路,使用task區(qū)分啟動任務(wù),實現(xiàn)任務(wù)可配置
- 監(jiān)測卡頓
- Block
- 對象捕獲:當(dāng)block內(nèi)引用外部變量時,會捕獲外部變量,這個捕獲會進(jìn)行復(fù)制操作,產(chǎn)生一個新的副本
- 堆棧轉(zhuǎn)移:當(dāng)block的執(zhí)行需要超出其所在方法的作用域時,就需要將其從棧拷貝到堆中
- 保留環(huán)的產(chǎn)生原理和解決方案:block被A引用,block內(nèi)部又引用A就會產(chǎn)生保留環(huán)。用__weak來解決
- 自動檢測保留環(huán)
- Auto release pool
- 原理、實現(xiàn):通過在主線程的runloop中注冊兩個通知,一個是剛剛進(jìn)入runloop,此時會創(chuàng)建一個自動釋放池,該操作的優(yōu)先級最高,會在所有其他回調(diào)之前。另一個是runloop即將休眠或退出的通知,此時會釋放自動釋放池。因此主線程的代碼通常會被自動釋放池很好的環(huán)繞,而不必?fù)?dān)心內(nèi)存泄漏。
- 對象的內(nèi)存結(jié)構(gòu)
- imp:函數(shù)指針,存儲方法的實現(xiàn)的地址
- isa:對象的isa指向類,類的指向元類,元類的指向超類,root類的元類指向root類
- 判斷兩個對象是否相等
- 什么情況會發(fā)生bad_access的情況
- 如何實現(xiàn)僵尸對象捕獲
- 如何實現(xiàn)bad_access捕獲
- 什么時候會發(fā)生內(nèi)存泄露:一個對象的引用計數(shù)無法歸零,不使用的堆內(nèi)存無法釋放
- weak和assign的實現(xiàn)
- 對象的存儲位置:堆,指針的位置:棧
UI - 響應(yīng)鏈
- 響應(yīng)鏈的查找過程:系統(tǒng)通過如下過程確定是哪里發(fā)生了touch事件AppDelegate->UIApplication->Window->Controller->View,hitTest方法會遍歷整個視圖層級,對每個子View調(diào)用pointInside方法來決定最后由哪個視圖來響應(yīng)事件。當(dāng)pointInside返回true時,繼續(xù)調(diào)用子View的該方法,直到?jīng)]有子View或該方法返回false結(jié)束。最后一個返回true的view就成為了第一響應(yīng)者,也就是touch事件生效的view。響應(yīng)者臉則是該過程的逆向。
- 如何擴(kuò)大按鈕的響應(yīng)區(qū)域:重寫 pointInside:withEvent方法
- layoutsubview和drawrect的調(diào)用時機(jī):layoutSubview會在修改了視圖大小、位置、添加了子view、設(shè)備旋轉(zhuǎn)以及更新約束時,或者調(diào)用了setNeedsLayout方法后,在下一次update cycle調(diào)用,或者在調(diào)用了layoutIfNeeded方法后立即調(diào)用(但是就像方法名描述的,如果在調(diào)用這個方法時沒有修改view使得系統(tǒng)將該View標(biāo)記為需要重新布局,則layoutSubview不會被調(diào)用,另一種情況是在一次runloop中連續(xù)調(diào)用了兩次layoutIfNeeded方法,那么layoutSubview也只會執(zhí)行一次);drawrect方法會在視圖的內(nèi)容變化后被調(diào)用,調(diào)用邏輯與layoutSubview相似
- cpu render和gpurender
- 自定義控件
- 貝塞爾曲線使用
- 屏幕旋轉(zhuǎn)的處理
- 視頻橫屏
- 個別控制器橫屏
- 自動布局的性能瓶頸
- tableview優(yōu)化
- 圖片展示優(yōu)化,預(yù)渲染
- 實現(xiàn)一個邊移動變旋轉(zhuǎn)的動畫:組動畫
- UIWindow層級關(guān)系,level:UIWindow根據(jù)level來決定顯示關(guān)系,即使一個window是先添加的,若他的level比后添加的要高,那么他也是處于層級更靠前的位置
- UItouch事件傳遞:自視圖頂層向下,直到AppDelegate,例外的是當(dāng)向view添加手勢時,手勢的響應(yīng)級別更高。
- iOS從啟動到展現(xiàn)的生命周期函數(shù):冷啟動:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions-> - (void)applicationDidBecomeActive:(UIApplication *)application;熱啟動(從后臺進(jìn)入前臺): - (void)applicationWillEnterForeground:(UIApplication *)application-> - (void)applicationDidBecomeActive:(UIApplication *)application
- 如何做一個全屏動畫而不影響事件響應(yīng):1、用響應(yīng)鏈的思路,讓hitTest返回nil,或者pointInSide返回false,或者userInteractionEnable設(shè)為NO。2、用layer實現(xiàn)
- 動畫過程中響應(yīng)觸摸事件:動畫移動過程中可以通過 presentationLayer獲得layer真實的位置,在父視圖中檢測點擊位置來響應(yīng)。
多線程 - 常見的幾種隊列方式:串行隊列和并發(fā)隊列
- gcd隊列的執(zhí)行方式:同步和異步
- 線程鎖死:在串行隊列中同步任務(wù)
- 多任務(wù)同步的方式:dispatch_sync和NSOperation Queue
- 當(dāng)多個operation添加到OperationQueue中時,默認(rèn)是異步并發(fā)執(zhí)行的,可以設(shè)置maxConcurrentOperationCount = 1來實現(xiàn)同步
- 任務(wù)抽象
- gcd原理
- 線程安全:信號量、鎖
- 組隊列
- 控制最大并發(fā)數(shù):NSOperationQueue 設(shè)置. maxConcurrentOperationCount
- 在dealloc中使用after,中訪問self有什么問題:self已經(jīng)釋放,會空指針異常
- 任務(wù)依賴:NSOperation可以通過 addDependency方法添加依賴
- 空閑時處理:
- qualityOfService:
- NSQualityOfServiceUserInteractive:用戶交互級別:最高級別,通常用于響應(yīng)用戶操作的UI處理,如將圖像繪制到屏幕上;
2. NSQualityOfServiceUserInitiated:用戶發(fā)起級別:由用戶發(fā)起的僅次于UI的任務(wù),用戶希望立即響應(yīng)并在此任務(wù)完成后進(jìn)行下一步操作。如遠(yuǎn)程內(nèi)容載入;
3. NSQualityOfServiceUtility:工具級別:由用戶或自動發(fā)起,不必要立即響應(yīng),不阻止用戶交互。通常以一個可見的進(jìn)度條來標(biāo)示進(jìn)度,例如預(yù)加載內(nèi)容、上傳或大量文件操作(如媒體導(dǎo)入)。
4. NSQualityOfServiceBackground:后臺級別:通常不是由用戶發(fā)起、用戶不可見的。例如備份、索引、數(shù)據(jù)同步等。
5. NSQualityOfServiceDefault:將從其他來源推測QoS,如果無法推斷,將使用 UserInitiated 到 Utility中的一個。- 此處需要注意另一個屬性 queuePriority,該屬性決定的是在NSOperationQueue中operation的執(zhí)行順序
- NSOperation使用
網(wǎng)絡(luò) - http協(xié)議結(jié)構(gòu)
- 優(yōu)化策略
- 鏈路優(yōu)化:HTTPDNS
- 壓縮body:Protobuf、壓縮算法(Brotli、Z-standard)
- keep alive、多路復(fù)用(http/1.2)
- 復(fù)用長鏈接
- dns映射,動態(tài)選路
- 合并請求
- IP直連
- 內(nèi)鏈,外鏈,路由
- socket
- 用nsurlconnection和nsurlsession寫請求
設(shè)計 - 高內(nèi)聚,低耦合
- 參數(shù)靈活性
3. 設(shè)計通用性
4. mvvm
5. 組件化
6. crash監(jiān)測,記錄,上報
算法
1. 排序
2. 深度和廣度
3. 寫一個檢測ip是否有效的算法
1. 字符串兩端空格過濾
2. 字符串中間含有空格為非法
3. ip子段開頭為0為非法(01.2.3.4)
4. 數(shù)組任意兩個數(shù)求和,要求和為給定的值,進(jìn)一步,n個數(shù)求和滿足條件
5. 最大子列和
6. 查找字符串中唯一且下標(biāo)最小的字符
7. 整形轉(zhuǎn)換,1234>4321
8. 加密算法了解
自己實現(xiàn)ORM 各種排序
基礎(chǔ)
堆和棧的概念,區(qū)別
AFN的底層實現(xiàn) UIconection ,session 區(qū)別,下載存磁盤,內(nèi)存, 上傳 基本形式文件,data
HTTP 和HTTPS 的區(qū)別
ssl 加密 i love you 所有字母都加4
i love you = 38rrjlsjdf83fjlsjf 伴隨著密鑰
NSUrlSession 和 NSUrlConnection 的區(qū)別
pthread c 管子是隊列 球線程 管子有沒有洞說明隊列是不是可以開異步線程
串行沒洞, 并行隊列 有洞
nsthread
gcd
nsoprition
UI動畫 關(guān)鍵幀 基本 轉(zhuǎn)場 lottie動畫 不掉幀不卡頓 硬件加速 可以正放倒放 各個點放 json方式繪制
WKWebView 和 UIWebView的區(qū)別 優(yōu)點
響應(yīng)式編程 跨類通信 發(fā)生事情可以 可以加入隊列 某個類來訂閱 訂閱的類會收到發(fā)生事情的信息
組件化 大而穩(wěn)定的情況下使用 組件化 為了避免無意修改造成的問題 對網(wǎng)絡(luò) 圖像 處理 刷新等 各種穩(wěn)定而不常更改的需求 進(jìn)行打包
github發(fā)布框架
缺點: 如果有小的API改動也需要重新打包 更新組件版本
運(yùn)行時 交換方法 load中調(diào)用 應(yīng)用場景 : 發(fā)匿名消息 調(diào)用某個方法
KVO 創(chuàng)建一個一樣的子類 然后更改或者欺騙當(dāng)前類的isa指針 指向子類對象
block 代理 函數(shù)指針 (函數(shù)入口地址)
網(wǎng)絡(luò):
SDWEBImage 同樣的URL 如果后臺更新了圖片 url沒變 前端 怎么知道 根據(jù)請求頭中有content屬性會記錄是否是新的請求。
AutoLayout 優(yōu)先級 布局
openGL: 圖片識別 磨砂 美顏 GPUImage
全景圖像 openGL ES 2.0 3.0
圖像處理:
openCV 取色
類的結(jié)構(gòu):
RunLoop :
是什么 ? 是一個單例對象 全局唯一 只能創(chuàng)建一次
NSTimer 和 runloop 的區(qū)別
runloop 比 timer 大 , 當(dāng)timer 運(yùn)行的時候 runloop 可能去做別的事情 然后導(dǎo)致timer 實時性差 timer 在runloop 忙得時候有可能漏 調(diào)
timer 被添加到runloop 中有幾個模式可以選擇 default 默認(rèn)模式, track UI追蹤模式 , commen 兼容 模式 如果選擇 非兼容模式遇到scrollView滾動的時可能導(dǎo)致timer 停止 所以解決方案 選擇兼容模式即可。
uitableView優(yōu)化
原因:
卡頓的點:
cell 太大 層級太多 View的創(chuàng)建和Frame的變化 賦值等會耗時 , reloadData cellForRow 做frame變化的處理