iOS大廠面試最常見問題匯總

基礎(chǔ)相關(guān)

  1. 什么是ARC?
  2. block一般用那個(gè)關(guān)鍵字修飾,為什么?
  3. 用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問題?
  4. @property 的本質(zhì)是什么?ivar、getter、setter 是如何生成并添加到這個(gè)類中的。
  5. 分別寫一個(gè)setter方法用于完成
    @property (nonatomic,retain)NSString *name
    @property (nonatomic,copy) NSString *name
  6. 說說assign vs weak,_block vs _weak的區(qū)別
  7. 請說出下面代碼是否有問題,如果有問題請修改?
@autoreleasepool {
        for (int i=0; i[largeNumber; i++) { (因識別問題,該行代碼中尖括號改為方括號代替)
            Person *per = [[Person alloc] init];
            [per autorelease];
        }
    }
  1. 請問下面代碼是否有問題,如有問題請修改?
@autoreleasepool {
        NSString *str = [[NSString alloc] init];
        [str retain];
        [str retain];
        str = @"jxl";
        [str release];
        [str release];
        [str release];
}
  1. 什么情況下使用weak關(guān)鍵字,相比assign有什么不同?什么情況使用weak關(guān)鍵字?
    11.內(nèi)存管理語義(assign、strong、weak等的區(qū)別)
    參考總結(jié)

runtime相關(guān)問題

結(jié)構(gòu)模型

  1. 介紹下runtime的內(nèi)存模型(isa、對象、類、metaclass、結(jié)構(gòu)體的存儲信息等)
  2. 為什么要設(shè)計(jì)metaclass
  3. class_copyIvarList & class_copyPropertyList區(qū)別
  4. class_rw_t 和 class_ro_t 的區(qū)別
  5. category如何被加載的,兩個(gè)category的load方法的加載順序,兩個(gè)category的同名方法的加載順序
  6. category & extension區(qū)別,能給NSObject添加Extension嗎,結(jié)果如何
  7. 消息轉(zhuǎn)發(fā)機(jī)制,消息轉(zhuǎn)發(fā)機(jī)制和其他語言的消息機(jī)制優(yōu)劣對比
  8. 在方法調(diào)用的時(shí)候,方法查詢-> 動態(tài)解析-> 消息轉(zhuǎn)發(fā) 之前做了什么
  9. IMP、SEL、Method的區(qū)別和使用場景
  10. load、initialize方法的區(qū)別什么?在繼承關(guān)系中他們有什么區(qū)別
  11. 說說消息轉(zhuǎn)發(fā)機(jī)制的優(yōu)劣

參考總結(jié)

內(nèi)存管理

  1. weak的實(shí)現(xiàn)原理?SideTable的結(jié)構(gòu)是什么樣的
  2. 關(guān)聯(lián)對象的應(yīng)用?系統(tǒng)如何實(shí)現(xiàn)關(guān)聯(lián)對象的
  3. 關(guān)聯(lián)對象的如何進(jìn)行內(nèi)存管理的?關(guān)聯(lián)對象如何實(shí)現(xiàn)weak屬性
  4. Autoreleasepool的原理?所使用的的數(shù)據(jù)結(jié)構(gòu)是什么
  5. ARC的實(shí)現(xiàn)原理?ARC下對retain & release做了哪些優(yōu)化
  6. ARC下哪些情況會造成內(nèi)存泄漏

參考總結(jié)

其他

  1. Method Swizzle注意事項(xiàng)
  2. 屬性修飾符atomic的內(nèi)部實(shí)現(xiàn)是怎么樣的?能保證線程安全嗎
  3. iOS 中內(nèi)省的幾個(gè)方法有哪些?內(nèi)部實(shí)現(xiàn)原理是什么
  4. class、objc_getClass、object_getclass 方法有什么區(qū)別?

NSNotification相關(guān)

蘋果并沒有開源相關(guān)代碼,但是可以讀下GNUStep的源碼,基本上實(shí)現(xiàn)方式很具有參考性

  1. 實(shí)現(xiàn)原理(結(jié)構(gòu)設(shè)計(jì)、通知如何存儲的、name&observer&SEL之間的關(guān)系等)
  2. 通知的發(fā)送時(shí)同步的,還是異步的
  3. NSNotificationCenter接受消息和發(fā)送消息是在一個(gè)線程里嗎?如何異步發(fā)送消息
  4. NSNotificationQueue是異步還是同步發(fā)送?在哪個(gè)線程響應(yīng)
  5. NSNotificationQueuerunloop的關(guān)系
  6. 如何保證通知接收的線程在主線程
  7. 頁面銷毀時(shí)不移除通知會崩潰嗎
  8. 多次添加同一個(gè)通知會是什么結(jié)果?多次移除通知呢
  9. 下面的方式能接收到通知嗎?為什么
// 發(fā)送通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"TestNotification" object:@1];
// 接收通知
[NSNotificationCenter.defaultCenter postNotificationName:@"TestNotification" object:nil];

參考總結(jié)

Runloop & KVO

runloop
  1. app如何接收到觸摸事件的
  2. 為什么只有主線程的runloop是開啟的
  3. 為什么只在主線程刷新UI
  4. PerformSelector和runloop的關(guān)系
  5. 如何使線程保活
KVO
  1. 實(shí)現(xiàn)原理
  2. 如何手動關(guān)閉kvo
  3. 通過KVC修改屬性會觸發(fā)KVO么
  4. 哪些情況下使用kvo會崩潰,怎么防護(hù)崩潰
  5. kvo的優(yōu)缺點(diǎn)

參考總結(jié)

Block

  1. block的內(nèi)部實(shí)現(xiàn),結(jié)構(gòu)體是什么樣的
  2. block是類嗎,有哪些類型
  3. 一個(gè)int變量被 __block 修飾與否的區(qū)別?block的變量截獲
  4. block在修改NSMutableArray,需不需要添加__block
  5. 怎么進(jìn)行內(nèi)存管理的
  6. block可以用strong修飾嗎
  7. 解決循環(huán)引用時(shí)為什么要用__strong、__weak修飾
  8. block發(fā)生copy時(shí)機(jī)
  9. Block訪問對象類型的auto變量時(shí),在ARC和MRC下有什么區(qū)別

參考總結(jié)

多線程

主要以GCD為主

  1. iOS開發(fā)中有多少類型的線程?分別對比
  2. GCD有哪些隊(duì)列,默認(rèn)提供哪些隊(duì)列
  3. GCD有哪些方法api
  4. GCD主線程 & 主隊(duì)列的關(guān)系
  5. 如何實(shí)現(xiàn)同步,有多少方式就說多少
  6. dispatch_once實(shí)現(xiàn)原理
  7. 什么情況下會死鎖
  8. 有哪些類型的線程鎖,分別介紹下作用和使用場景
  9. NSOperationQueue中的maxConcurrentOperationCount默認(rèn)值
  10. NSTimer、CADisplayLink、dispatch_source_t 的優(yōu)劣

視圖&圖像相關(guān)

  1. AutoLayout的原理,性能如何
  2. UIView & CALayer的區(qū)別
  3. 事件響應(yīng)鏈
  4. drawrect & layoutsubviews調(diào)用時(shí)機(jī)
  5. UI的刷新原理
  6. 隱式動畫 & 顯示動畫區(qū)別
  7. 什么是離屏渲染
  8. imageName & imageWithContentsOfFile區(qū)別
  9. 多個(gè)相同的圖片,會重復(fù)加載嗎
  10. 圖片是什么時(shí)候解碼的,如何優(yōu)化
  11. 圖片渲染怎么優(yōu)化
  12. 如果GPU的刷新率超過了iOS屏幕60Hz刷新率是什么現(xiàn)象,怎么解決

性能優(yōu)化

  1. 如何做啟動優(yōu)化,如何監(jiān)控
  2. 如何做卡頓優(yōu)化,如何監(jiān)控
  3. 如何做耗電優(yōu)化,如何監(jiān)控
  4. 如何做網(wǎng)絡(luò)優(yōu)化,如何監(jiān)控
  5. 如何降低APP包的大小
  6. 如何提升 tableview 的流暢度
  7. 如何檢測離屏渲染與優(yōu)化
  8. 日常如何檢查內(nèi)存泄露?

開發(fā)證書

  1. 蘋果使用證書的目的是什么
  2. AppStore安裝app時(shí)的認(rèn)證流程
  3. 開發(fā)者怎么在debug模式下把a(bǔ)pp安裝到設(shè)備呢

參考總結(jié)

其他問題

  1. PerformSelector & NSInvocation優(yōu)劣對比
  2. oc怎么實(shí)現(xiàn)多繼承?怎么面向切面(可以參考Aspects深度解析-iOS面向切面編程
  3. 哪些bug會導(dǎo)致崩潰,如何防護(hù)崩潰
  4. 怎么監(jiān)控崩潰
  5. app的啟動過程(考察LLVM編譯過程、靜態(tài)鏈接、動態(tài)鏈接、runtime初始化)
  6. 沙盒目錄的每個(gè)文件夾劃分的作用
  7. 簡述下match-o文件結(jié)構(gòu)

系統(tǒng)基礎(chǔ)知識

  1. 進(jìn)程和線程的區(qū)別
  2. HTTPS的握手過程
  3. 什么是中間人攻擊?怎么預(yù)防
  4. TCP的握手過程?為什么進(jìn)行三次握手,四次揮手
  5. 堆和棧區(qū)的區(qū)別?誰的占用內(nèi)存空間大
  6. 加密算法:對稱加密算法和非對稱加密算法區(qū)別
  7. 常見的對稱加密和非對稱加密算法有哪些
  8. MD5、Sha1、Sha256區(qū)別
  9. charles抓包過程?不使用charles,4G網(wǎng)絡(luò)如何抓包

參考總結(jié)

架構(gòu)設(shè)計(jì)

  1. 手動埋點(diǎn)、自動化埋點(diǎn)、可視化埋點(diǎn)
  2. MVC、MVP、MVVM設(shè)計(jì)模式
  3. 常見的設(shè)計(jì)模式
  4. 單例的弊端
  5. 常見的路由方案,以及優(yōu)缺點(diǎn)對比
  6. 如果保證項(xiàng)目的穩(wěn)定性
  7. 設(shè)計(jì)一個(gè)圖片緩存框架(LRU)
  8. 如何設(shè)計(jì)一個(gè)git diff
  9. 設(shè)計(jì)一個(gè)線程池?畫出你的架構(gòu)圖
  10. 你的app架構(gòu)是什么,有什么優(yōu)缺點(diǎn)、為什么這么做、怎么改進(jìn)

數(shù)據(jù)結(jié)構(gòu)與算法

  1. 八大排序算法
  2. 棧&隊(duì)列
  3. 字符串處理
  4. 鏈表
  5. 二叉樹相關(guān)操作
  6. 深搜廣搜
  7. 基本的動態(tài)規(guī)劃題、貪心算法、二分查找

iOS面試題答案專欄推薦

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

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

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