OC
- runtime
- method_swizzled使用和原理:方法的調(diào)用實際上是消息發(fā)送趣避,一個對象收到消息之后會在類的方法列表中(或者緩存列表)中尋找該消息對應的method沉唠,swizzled就是修改方法列表中的元素驳规,使得method中的imp指針指向交換后的實現(xiàn)涉馅,從而達到方法交換的目的旭蠕。
- category方法覆蓋關系,為什么不允許新增實例變量
- load和initialize:load方法在文件被裝載時調(diào)用亭枷,線程安全袭艺,只會被調(diào)用一次,一般用于方法交換叨粘。initialize方法會在首次給該類發(fā)送消息時調(diào)用猾编,一般可以用于為不方便在編譯期賦值的靜態(tài)變量賦值。
- kvo
- runloop
- 與多線程的關系:線程與runloop是一一對應的關系宣鄙,一個線程最多擁有一個runloop(在非主線程袍镀,只有執(zhí)行了獲取函數(shù)才會創(chuàng)建runloop),并且runloop只能在所在的線程獲榷澄睢(mainRunloop除外)
- 如何獲取fps:由于CADisplayLink與屏幕刷新率一致(60fps),所以將它加入到mainRunloop中绸吸,通過計算兩次執(zhí)行的間隔時間即可得到fps鼻弧。
- 啟動優(yōu)化设江,記錄+load到第二個main runloop時間間隔計算啟動時間。優(yōu)化啟動鏈路攘轩,使用task區(qū)分啟動任務叉存,實現(xiàn)任務可配置
- 監(jiān)測卡頓
- Block
- 對象捕獲:當block內(nèi)引用外部變量時,會捕獲外部變量度帮,這個捕獲會進行復制操作歼捏,產(chǎn)生一個新的副本
- 堆棧轉(zhuǎn)移:當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中注冊兩個通知练俐,一個是剛剛進入runloop,此時會創(chuàng)建一個自動釋放池冕臭,該操作的優(yōu)先級最高腺晾,會在所有其他回調(diào)之前。另一個是runloop即將休眠或退出的通知辜贵,此時會釋放自動釋放池悯蝉。因此主線程的代碼通常會被自動釋放池很好的環(huán)繞,而不必擔心內(nèi)存泄漏托慨。
- 對象的內(nèi)存結構
- 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 - 響應鏈
- 響應鏈的查找過程:系統(tǒng)通過如下過程確定是哪里發(fā)生了touch事件AppDelegate->UIApplication->Window->Controller->View讨彼,hitTest方法會遍歷整個視圖層級,對每個子View調(diào)用pointInside方法來決定最后由哪個視圖來響應事件柿祈。當pointInside返回true時哈误,繼續(xù)調(diào)用子View的該方法,直到?jīng)]有子View或該方法返回false結束躏嚎。最后一個返回true的view就成為了第一響應者蜜自,也就是touch事件生效的view。響應者臉則是該過程的逆向卢佣。
- 如何擴大按鈕的響應區(qū)域:重寫 pointInside:withEvent方法
- layoutsubview和drawrect的調(diào)用時機:layoutSubview會在修改了視圖大小重荠、位置、添加了子view虚茶、設備旋轉(zhuǎn)以及更新約束時戈鲁,或者調(diào)用了setNeedsLayout方法后仇参,在下一次update cycle調(diào)用,或者在調(diào)用了layoutIfNeeded方法后立即調(diào)用(但是就像方法名描述的婆殿,如果在調(diào)用這個方法時沒有修改view使得系統(tǒng)將該View標記為需要重新布局诈乒,則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)化消约,預渲染
- 實現(xiàn)一個邊移動變旋轉(zhuǎn)的動畫:組動畫
- UIWindow層級關系肠鲫,level:UIWindow根據(jù)level來決定顯示關系,即使一個window是先添加的荆陆,若他的level比后添加的要高滩届,那么他也是處于層級更靠前的位置
- UItouch事件傳遞:自視圖頂層向下,直到AppDelegate被啼,例外的是當向view添加手勢時帜消,手勢的響應級別更高。
- iOS從啟動到展現(xiàn)的生命周期函數(shù):冷啟動:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions-> - (void)applicationDidBecomeActive:(UIApplication *)application;熱啟動(從后臺進入前臺): - (void)applicationWillEnterForeground:(UIApplication *)application-> - (void)applicationDidBecomeActive:(UIApplication *)application
- 如何做一個全屏動畫而不影響事件響應:1浓体、用響應鏈的思路,讓hitTest返回nil命浴,或者pointInSide返回false生闲,或者userInteractionEnable設為NO。2悬蔽、用layer實現(xiàn)
- 動畫過程中響應觸摸事件:動畫移動過程中可以通過 presentationLayer獲得layer真實的位置捉兴,在父視圖中檢測點擊位置來響應倍啥。
多線程 - 常見的幾種隊列方式:串行隊列和并發(fā)隊列
- gcd隊列的執(zhí)行方式:同步和異步
- 線程鎖死:在串行隊列中同步任務
- 多任務同步的方式:dispatch_sync和NSOperation Queue
- 當多個operation添加到OperationQueue中時,默認是異步并發(fā)執(zhí)行的始藕,可以設置maxConcurrentOperationCount = 1來實現(xiàn)同步
- 任務抽象
- gcd原理
- 線程安全:信號量鳄虱、鎖
- 組隊列
- 控制最大并發(fā)數(shù):NSOperationQueue 設置. maxConcurrentOperationCount
- 在dealloc中使用after凭峡,中訪問self有什么問題:self已經(jīng)釋放摧冀,會空指針異常
- 任務依賴:NSOperation可以通過 addDependency方法添加依賴
- 空閑時處理:
- qualityOfService:
- NSQualityOfServiceUserInteractive:用戶交互級別:最高級別,通常用于響應用戶操作的UI處理建车,如將圖像繪制到屏幕上缤至;
2. NSQualityOfServiceUserInitiated:用戶發(fā)起級別:由用戶發(fā)起的僅次于UI的任務康谆,用戶希望立即響應并在此任務完成后進行下一步操作。如遠程內(nèi)容載入月洛;
3. NSQualityOfServiceUtility:工具級別:由用戶或自動發(fā)起嚼黔,不必要立即響應唬涧,不阻止用戶交互盛撑。通常以一個可見的進度條來標示進度,例如預加載內(nèi)容钓株、上傳或大量文件操作(如媒體導入)轴合。
4. NSQualityOfServiceBackground:后臺級別:通常不是由用戶發(fā)起碗短、用戶不可見的。例如備份纲堵、索引席函、數(shù)據(jù)同步等冈涧。
5. NSQualityOfServiceDefault:將從其他來源推測QoS,如果無法推斷营曼,將使用 UserInitiated 到 Utility中的一個蒂阱。- 此處需要注意另一個屬性 queuePriority狂塘,該屬性決定的是在NSOperationQueue中operation的執(zhí)行順序
- NSOperation使用
網(wǎng)絡 - http協(xié)議結構
- 優(yōu)化策略
- 鏈路優(yōu)化:HTTPDNS
- 壓縮body:Protobuf睹耐、壓縮算法(Brotli、Z-standard)
- keep alive响委、多路復用(http/1.2)
- 復用長鏈接
- dns映射窖梁,動態(tài)選路
- 合并請求
- IP直連
- 內(nèi)鏈纵刘,外鏈,路由
- socket
- 用nsurlconnection和nsurlsession寫請求
設計 - 高內(nèi)聚瞬捕,低耦合
- 參數(shù)靈活性
3. 設計通用性
4. mvvm
5. 組件化
6. crash監(jiān)測肪虎,記錄惧蛹,上報
算法
1. 排序
2. 深度和廣度
3. 寫一個檢測ip是否有效的算法
1. 字符串兩端空格過濾
2. 字符串中間含有空格為非法
3. ip子段開頭為0為非法(01.2.3.4)
4. 數(shù)組任意兩個數(shù)求和,要求和為給定的值装畅,進一步掠兄,n個數(shù)求和滿足條件
5. 最大子列和
6. 查找字符串中唯一且下標最小的字符
7. 整形轉(zhuǎn)換掺出,1234>4321
8. 加密算法了解
自己實現(xiàn)ORM 各種排序
基礎
堆和棧的概念汤锨,區(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動畫 關鍵幀 基本 轉(zhuǎn)場 lottie動畫 不掉幀不卡頓 硬件加速 可以正放倒放 各個點放 json方式繪制
WKWebView 和 UIWebView的區(qū)別 優(yōu)點
響應式編程 跨類通信 發(fā)生事情可以 可以加入隊列 某個類來訂閱 訂閱的類會收到發(fā)生事情的信息
組件化 大而穩(wěn)定的情況下使用 組件化 為了避免無意修改造成的問題 對網(wǎng)絡 圖像 處理 刷新等 各種穩(wěn)定而不常更改的需求 進行打包
github發(fā)布框架
缺點: 如果有小的API改動也需要重新打包 更新組件版本
運行時 交換方法 load中調(diào)用 應用場景 : 發(fā)匿名消息 調(diào)用某個方法
KVO 創(chuàng)建一個一樣的子類 然后更改或者欺騙當前類的isa指針 指向子類對象
block 代理 函數(shù)指針 (函數(shù)入口地址)
網(wǎng)絡:
SDWEBImage 同樣的URL 如果后臺更新了圖片 url沒變 前端 怎么知道 根據(jù)請求頭中有content屬性會記錄是否是新的請求害晦。
AutoLayout 優(yōu)先級 布局
openGL: 圖片識別 磨砂 美顏 GPUImage
全景圖像 openGL ES 2.0 3.0
圖像處理:
openCV 取色
類的結構:
RunLoop :
是什么 壹瘟? 是一個單例對象 全局唯一 只能創(chuàng)建一次
NSTimer 和 runloop 的區(qū)別
runloop 比 timer 大 稻轨, 當timer 運行的時候 runloop 可能去做別的事情 然后導致timer 實時性差 timer 在runloop 忙得時候有可能漏 調(diào)
timer 被添加到runloop 中有幾個模式可以選擇 default 默認模式严衬, track UI追蹤模式 笆呆, commen 兼容 模式 如果選擇 非兼容模式遇到scrollView滾動的時可能導致timer 停止 所以解決方案 選擇兼容模式即可赠幕。
uitableView優(yōu)化
原因:
卡頓的點:
cell 太大 層級太多 View的創(chuàng)建和Frame的變化 賦值等會耗時 榕堰, reloadData cellForRow 做frame變化的處理