面試碰到的問題2

OC

  1. runtime
    1. method_swizzled使用和原理:方法的調(diào)用實際上是消息發(fā)送,一個對象收到消息之后會在類的方法列表中(或者緩存列表)中尋找該消息對應(yīng)的method,swizzled就是修改方法列表中的元素,使得method中的imp指針指向交換后的實現(xiàn),從而達(dá)到方法交換的目的。
    2. category方法覆蓋關(guān)系,為什么不允許新增實例變量
    3. load和initialize:load方法在文件被裝載時調(diào)用,線程安全,只會被調(diào)用一次,一般用于方法交換。initialize方法會在首次給該類發(fā)送消息時調(diào)用,一般可以用于為不方便在編譯期賦值的靜態(tài)變量賦值。
    4. kvo
  2. runloop
    1. 與多線程的關(guān)系:線程與runloop是一一對應(yīng)的關(guān)系,一個線程最多擁有一個runloop(在非主線程,只有執(zhí)行了獲取函數(shù)才會創(chuàng)建runloop),并且runloop只能在所在的線程獲取(mainRunloop除外)
    2. 如何獲取fps:由于CADisplayLink與屏幕刷新率一致(60fps),所以將它加入到mainRunloop中,通過計算兩次執(zhí)行的間隔時間即可得到fps。
    3. 啟動優(yōu)化,記錄+load到第二個main runloop時間間隔計算啟動時間。優(yōu)化啟動鏈路,使用task區(qū)分啟動任務(wù),實現(xiàn)任務(wù)可配置
    4. 監(jiān)測卡頓
  3. Block
    1. 對象捕獲:當(dāng)block內(nèi)引用外部變量時,會捕獲外部變量,這個捕獲會進(jìn)行復(fù)制操作,產(chǎn)生一個新的副本
    2. 堆棧轉(zhuǎn)移:當(dāng)block的執(zhí)行需要超出其所在方法的作用域時,就需要將其從棧拷貝到堆中
    3. 保留環(huán)的產(chǎn)生原理和解決方案:block被A引用,block內(nèi)部又引用A就會產(chǎn)生保留環(huán)。用__weak來解決
    4. 自動檢測保留環(huán)
  4. Auto release pool
    1. 原理、實現(xiàn):通過在主線程的runloop中注冊兩個通知,一個是剛剛進(jìn)入runloop,此時會創(chuàng)建一個自動釋放池,該操作的優(yōu)先級最高,會在所有其他回調(diào)之前。另一個是runloop即將休眠或退出的通知,此時會釋放自動釋放池。因此主線程的代碼通常會被自動釋放池很好的環(huán)繞,而不必?fù)?dān)心內(nèi)存泄漏。
  5. 對象的內(nèi)存結(jié)構(gòu)
  6. imp:函數(shù)指針,存儲方法的實現(xiàn)的地址
  7. isa:對象的isa指向類,類的指向元類,元類的指向超類,root類的元類指向root類
  8. 判斷兩個對象是否相等
  9. 什么情況會發(fā)生bad_access的情況
    1. 如何實現(xiàn)僵尸對象捕獲
    2. 如何實現(xiàn)bad_access捕獲
  10. 什么時候會發(fā)生內(nèi)存泄露:一個對象的引用計數(shù)無法歸零,不使用的堆內(nèi)存無法釋放
  11. weak和assign的實現(xiàn)
  12. 對象的存儲位置:堆,指針的位置:棧
    UI
  13. 響應(yīng)鏈
    1. 響應(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)者臉則是該過程的逆向。
    2. 如何擴(kuò)大按鈕的響應(yīng)區(qū)域:重寫 pointInside:withEvent方法
  14. 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相似
  15. cpu render和gpurender
  16. 自定義控件
  17. 貝塞爾曲線使用
  18. 屏幕旋轉(zhuǎn)的處理
    1. 視頻橫屏
    2. 個別控制器橫屏
  19. 自動布局的性能瓶頸
  20. tableview優(yōu)化
    1. 圖片展示優(yōu)化,預(yù)渲染
  21. 實現(xiàn)一個邊移動變旋轉(zhuǎn)的動畫:組動畫
  22. UIWindow層級關(guān)系,level:UIWindow根據(jù)level來決定顯示關(guān)系,即使一個window是先添加的,若他的level比后添加的要高,那么他也是處于層級更靠前的位置
  23. UItouch事件傳遞:自視圖頂層向下,直到AppDelegate,例外的是當(dāng)向view添加手勢時,手勢的響應(yīng)級別更高。
  24. 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
  25. 如何做一個全屏動畫而不影響事件響應(yīng):1、用響應(yīng)鏈的思路,讓hitTest返回nil,或者pointInSide返回false,或者userInteractionEnable設(shè)為NO。2、用layer實現(xiàn)
  26. 動畫過程中響應(yīng)觸摸事件:動畫移動過程中可以通過 presentationLayer獲得layer真實的位置,在父視圖中檢測點擊位置來響應(yīng)。
    多線程
  27. 常見的幾種隊列方式:串行隊列和并發(fā)隊列
  28. gcd隊列的執(zhí)行方式:同步和異步
  29. 線程鎖死:在串行隊列中同步任務(wù)
  30. 多任務(wù)同步的方式:dispatch_sync和NSOperation Queue
    1. 當(dāng)多個operation添加到OperationQueue中時,默認(rèn)是異步并發(fā)執(zhí)行的,可以設(shè)置maxConcurrentOperationCount = 1來實現(xiàn)同步
  31. 任務(wù)抽象
  32. gcd原理
  33. 線程安全:信號量、鎖
  34. 組隊列
  35. 控制最大并發(fā)數(shù):NSOperationQueue 設(shè)置. maxConcurrentOperationCount
  36. 在dealloc中使用after,中訪問self有什么問題:self已經(jīng)釋放,會空指針異常
  37. 任務(wù)依賴:NSOperation可以通過 addDependency方法添加依賴
  38. 空閑時處理:
    1. qualityOfService:
  39. 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中的一個。
    1. 此處需要注意另一個屬性 queuePriority,該屬性決定的是在NSOperationQueue中operation的執(zhí)行順序
  40. NSOperation使用
    網(wǎng)絡(luò)
  41. http協(xié)議結(jié)構(gòu)
  42. 優(yōu)化策略
    1. 鏈路優(yōu)化:HTTPDNS
    2. 壓縮body:Protobuf、壓縮算法(Brotli、Z-standard)
    3. keep alive、多路復(fù)用(http/1.2)
    4. 復(fù)用長鏈接
    5. dns映射,動態(tài)選路
    6. 合并請求
    7. IP直連
  43. 內(nèi)鏈,外鏈,路由
  44. socket
  45. 用nsurlconnection和nsurlsession寫請求
    設(shè)計
  46. 高內(nèi)聚,低耦合
  47. 參數(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變化的處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,282評論 8 265
  • OC語言基礎(chǔ) 1.類與對象 類方法 OC的類方法只有2種:靜態(tài)方法和實例方法兩種 在OC中,只要方法聲明在@int...
    奇異果好補(bǔ)閱讀 4,532評論 0 11
  • 1,NSObject中description屬性的意義,它可以重寫嗎?答案:每當(dāng) NSLog(@"")函數(shù)中出現(xiàn) ...
    eightzg閱讀 4,351評論 2 19
  • 環(huán)境中祝福的語言多 真心的少? 大家習(xí)慣了,等待看一種笑話,所以使得正在努力的人?感到寂寞和害怕! 害怕真的成為別...
    蔡振源閱讀 262評論 0 5
  • 遠(yuǎn)方的路看不清,好孤單! 80年代末 ,我出生在成都市太陽升起最早的偏僻鄉(xiāng)村。我想那一年祖父祖母都還是艾服之年,父...
    十六筆的稗子閱讀 204評論 0 0

友情鏈接更多精彩內(nèi)容