前言:
最近公司項(xiàng)目不怎么忙, 閑暇時(shí)間把iOS 在面試中可能會(huì)遇到的問(wèn)題整理了一番, 一部分題目是自己面試遇到的,一部分題目則是網(wǎng)上收錄的, 方便自己鞏固復(fù)習(xí), 也分享給大家! 知識(shí)點(diǎn)比較多,比較雜,這里做了分類(lèi),下面是分類(lèi)鏈接地址;
面試知識(shí)點(diǎn)整理 - 目錄:
iOS | 面試知識(shí)整理 - OC基礎(chǔ) (一)
iOS | 面試知識(shí)整理 - OC基礎(chǔ) (二)
iOS | 面試知識(shí)整理 - OC底層 (三)
iOS | 面試知識(shí)整理 - UI 相 關(guān) (四)
iOS | 面試知識(shí)整理 - 內(nèi)存管理 (五)
iOS | 面試知識(shí)整理 - 多 線(xiàn) 程 (六)
iOS | 面試知識(shí)整理 - 網(wǎng)絡(luò)相關(guān) (七)
iOS | 面試知識(shí)整理 - 數(shù)據(jù)持久化 (八)
iOS | 面試知識(shí)整理 - Swift 基礎(chǔ) (九)
iOS | 面試知識(shí)整理 - 三方框架 (十)
iOS | 面試知識(shí)整理 - 三方框架 (十)
1.列舉現(xiàn)在熟悉 iOS開(kāi)發(fā)庫(kù)和第三方開(kāi)發(fā)庫(kù)?
iOS開(kāi)發(fā)中第三方框架非常豐富,種類(lèi)和數(shù)量也繁多,所謂框架就是對(duì)每一類(lèi)功能的封裝,作為快捷的使用開(kāi)發(fā)工具,提升開(kāi)發(fā)效率
OC 常用的三方庫(kù)如下:
| 框架名稱(chēng) | 描述 |
|---|---|
| AFNetworking | 網(wǎng)絡(luò)請(qǐng)求 |
| SDWebImage | 圖像異步加載 |
| MJRefresh | 上啦下拉刷新 |
| MJExtension | 數(shù)據(jù)解析 |
| MBProgressHUD | 進(jìn)度顯示組件 |
| FMDB | SQLite的封裝數(shù)據(jù)庫(kù) |
| Masonry | 自動(dòng)布局 |
| Charts | 圖標(biāo)繪制庫(kù) |
| CocoaAsyncSocket | 異步 Socket 網(wǎng)絡(luò)編程框架 |
| AsyncDisplayKit | 異步UI 加載庫(kù) |
| Aspects | 面向切面編程庫(kù) |
| CocoaLumberjack | 簡(jiǎn)單高效快速靈活登錄模塊框架 |
| DZNEmptyDataSet | 空列表UI庫(kù),列表為空時(shí)友好展示庫(kù) |
| FSCalendar | 日歷控件庫(kù) |
| JazzHands | 應(yīng)用滑動(dòng)引導(dǎo)頁(yè)頁(yè)動(dòng)畫(huà)庫(kù) |
| JSPatch | 熱更新 |
| AvoidCrash | 容錯(cuò)處理框架 |
| Bludy | 錯(cuò)誤收集 |
Swift比較常用庫(kù)
| 框架名稱(chēng) | 描述 |
|---|---|
| SnapKit | 自動(dòng)布局 |
| Alamofire | 網(wǎng)絡(luò)請(qǐng)求 |
| Kingfisher | 異步圖片加載庫(kù) |
| KakaJSON | 數(shù)據(jù)解析 |
| PKHUD | 進(jìn)度顯示組件 |
| SwiftyJSON | 轉(zhuǎn)JSON庫(kù) |
2. SDWebImage加載原理?
- 當(dāng)我們的
UIImageView控件調(diào)用sd_setImageWithURL: ()...方法 來(lái)進(jìn)行加載圖片; - 框架會(huì)直接調(diào)用
UIView+WebCache中的sd_internalSetImageWithURL:() ..., 該方法是UIImageView和UIButton的共有拓展方法 - 接下來(lái)調(diào)用
SDWebImageManager類(lèi)中的loadImageWithURL:() ...方法,會(huì)根據(jù)提供的圖片URL加載圖片,SDWebImageManager主要負(fù)責(zé)管理SDImageCache緩存和SDWebImageDownloader下載器 - 首先進(jìn)入
SDImageCache類(lèi),調(diào)用queryCacheOperationForKey...在內(nèi)存或者磁盤(pán)進(jìn)行查詢(xún),如果有圖片緩存則進(jìn)行回調(diào)展示, 如果沒(méi)有查詢(xún)到圖片緩存,則進(jìn)行下一步下載 - 在未查詢(xún)到圖片緩存時(shí),
SDWebImageDownloader類(lèi)會(huì)進(jìn)行網(wǎng)絡(luò)下載,下載成功后進(jìn)行回調(diào)展示,并將下載的圖片緩存到內(nèi)存和磁盤(pán)
總結(jié):
根據(jù)Url在內(nèi)存中查詢(xún)圖片,如果有則展示,沒(méi)有則在磁盤(pán)查詢(xún)圖片,查詢(xún)到展示, 沒(méi)有查詢(xún)到在會(huì)通過(guò)網(wǎng)絡(luò)下載進(jìn)行展示。下載完后會(huì)存儲(chǔ)到內(nèi)存和磁盤(pán),方便下次直接使用,磁盤(pán)查詢(xún)和網(wǎng)絡(luò)下載都是異步的,不會(huì)影響主線(xiàn)程.
3 .SDWebImage框架的架構(gòu)是怎么樣的?
SDWebImage 有三個(gè)核心組件:
- SDWebImageManager: 核心管理器
- SDImageCache: 緩存處理組件,主要負(fù)責(zé)內(nèi)存緩存以及磁盤(pán)緩存
- SDImageDownloader: 下載處理組件,負(fù)責(zé)異步下載圖片等操作
4. SDWebImage 圖片名稱(chēng)是如何處理?
- 拿到圖片對(duì)應(yīng)的URL路徑,對(duì)該路徑進(jìn)行MD5加密,作為名稱(chēng)進(jìn)行保存
5. SDWebImage的最大并發(fā)數(shù)是多少?
_downloadQueue.maxConcurrentOperationCount = 6;
6. SDWebImage默認(rèn)下載的超時(shí)時(shí)長(zhǎng)是多少?
15秒, _downloadTimeout = 15.0;
7. SDWebImage默認(rèn)緩存的時(shí)間是多久?
一周時(shí)間
_maxCacheAge = kDefaultCacheMaxCacheAge;
static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week
6.AFNetWorking 架構(gòu)分析?
AFN根據(jù)功能模塊來(lái)劃分,可以分為5個(gè)部分:
- NSURLSession - 負(fù)責(zé)網(wǎng)絡(luò)通信工作(核心)
- Serialization - 負(fù)責(zé)數(shù)據(jù)的序列化工作
- Reachability - 負(fù)責(zé)網(wǎng)絡(luò)狀態(tài)監(jiān)聽(tīng)工作
- Security - 負(fù)責(zé)安全認(rèn)證工作
- UIKit - 對(duì)UIKit框架擴(kuò)展
AFNetworking 實(shí)際上只是對(duì) NSURLSession 高度地封裝, 提供一些簡(jiǎn)單易用的 API 方便我們?cè)?iOS 開(kāi)發(fā)中發(fā)出網(wǎng)絡(luò)請(qǐng)求并在其上更快地構(gòu)建網(wǎng)絡(luò)層組件并提供合理的接口;
7.AFNetworking 2.0 和3.0 的區(qū)別
在AFNetworking 3.0之前,底層是通過(guò)封裝NSURLConnection來(lái)實(shí)現(xiàn)的。
在AFNetworking 3.0之后,也就是在iOS 9.0 之后,NSURLConnection被棄用,蘋(píng)果推薦使用NSURLSession來(lái)管理網(wǎng)絡(luò)請(qǐng)求,所以AFNetworking 3.0之后,底層是通過(guò)封裝NSURLSession來(lái)實(shí)現(xiàn)的。
從AFNetworking 3.0中之后,下面三個(gè)方法被棄用了。
AFURLConnectionOperation
AFHTTPRequestOperation
AFHTTPRequestOperationManager
- 依次被下面三個(gè)類(lèi)代替了,同時(shí)請(qǐng)求方法也跟著改變了,所以AFNetworking 3.0以后發(fā)生了很大的變化。
AFURLSessionManager
AFHTTPSessionManager
AFNetworkReachabilityManager
8.MJExtension 字典轉(zhuǎn)模型原理?
MJExtension是一個(gè)轉(zhuǎn)換速度快、使用簡(jiǎn)單方便的字典轉(zhuǎn)模型框架, 通過(guò)rumtime獲取對(duì)象的所有成員變量(包括父類(lèi)的),通過(guò)KVC進(jìn)行賦值操作,達(dá)到了將字典數(shù)據(jù)映射到了模型對(duì)象上;
9.FMDB如何保證線(xiàn)程安全?
FMDB是對(duì)蘋(píng)果SQLite的封裝, 通過(guò)使用FMDatabaseQueue 來(lái)保證線(xiàn)程安全,FMDatabaseQueue是同步執(zhí)行, _queue是 同步串行隊(duì)列。
10.你讀過(guò)哪些三方庫(kù)源碼?
11.常用的 git 指令有什么?
git clone # 克隆代碼倉(cāng)庫(kù)
git add # 將工作區(qū)的修改提交到暫存區(qū)
git commit # 將暫存區(qū)的修改提交到當(dāng)前分支
git reset # 回退到某一個(gè)版本
git stash # 保存某次修改
git pull # 從遠(yuǎn)程更新代碼
git push # 將本地代碼更新到遠(yuǎn)程分支上
git reflog # 查看歷史命令
git status # 查看當(dāng)前倉(cāng)庫(kù)的狀態(tài)
git diff # 查看修改
git log # 查看提交歷史
git revert # 回退某個(gè)修改
git checkout -b dev #創(chuàng)建分支,然后切換到分支
git branch # 查看當(dāng)前分支
git merge dev #合并指定分支到當(dāng)前分支