面試-A公司
面試題
- 如果要你設(shè)計一個復(fù)雜頁面你會怎么處理威鹿?
- 談?wù)勀銓δK化和組件化的看法。他們有哪些優(yōu)勢和缺點轨香。如何做到解耦专普。
- 你認(rèn)為NSDictionary是怎么實現(xiàn)的?
- 為什么會產(chǎn)生卡頓,什么是離屏渲染弹沽?為什么會產(chǎn)生離屏渲染?
- NStimer和cgd的定時器有什么區(qū)別筋粗,為什么說NSTimer的定時器是不準(zhǔn)確的策橘。還有什么方式來實現(xiàn)定時器
- iOS開發(fā)中都有哪些鎖,有什么區(qū)別娜亿。@synchronized這個鎖里有一個參數(shù)self丽已。有什么用,如果它被釋放了有什么后果买决,可不可以是其他對象沛婴,為什么吼畏?
- 啟動優(yōu)化有哪些?
- 如何讓你實現(xiàn)一個addobserver你會怎么設(shè)計嘁灯。有哪些需要注意的點(生成的新類是強引用還是弱引用)開源庫kvoviewcontroller以及rac的addobserve是如何做到不產(chǎn)生循環(huán)引用的
- 如果任務(wù)a依賴于任務(wù)b和c的執(zhí)行泻蚊,你怎么處理
- 你對flutter和RN有什么看法
- 性能優(yōu)化你做了哪些工作
- socket和tcp udp有什么區(qū)別,socket原理是什么丑婿,socket在app之間傳輸用的什么性雄。引申到http如何使用長連接 keep-alive的使用。
- gcd的底層實現(xiàn)羹奉。我們能開辟的最大線程數(shù)是多少秒旋?默認(rèn)值是多少?
- gcd中的notify和barrier有什么區(qū)別
算法題 - 如何判斷兩個樹是否相等
- 我們在統(tǒng)計過程中需要知道一個VC上有多少個子view 你怎么處理诀拭?用算法實現(xiàn)迁筛。
小細(xì)節(jié) - setobject:forkey key除了用字符串能用對象嗎?
面試題-B公司
面試題:
- 談?wù)勀銓κ录憫?yīng)機制的看法
- 內(nèi)存相關(guān)
- 談?wù)勀銓?nèi)存管理的看法
- arc下能否自己控制對象的生命周期
- coreFoundation中我們用__bridge來處理與oc之間的轉(zhuǎn)換為什么呢耕挨?結(jié)構(gòu)體中為什么不能使用oc對象细卧,為什么?
- 多線程問題
- 開發(fā)過程中你遇到過哪些線程的問題俗孝,你是怎么解決的酒甸?
- 鎖相關(guān)
- iOS開發(fā)中有哪些鎖?他們有哪些應(yīng)用場景赋铝?他們有什么區(qū)別插勤?
- 循環(huán)引用問題
- 循環(huán)引用是如何產(chǎn)生的?你是怎么解決的革骨?你是怎么檢測循環(huán)引用的农尖?如果用第三方工具 請簡述其原理
- 性能優(yōu)化相關(guān)
- 為什么會產(chǎn)生離屏渲染?為什么圓角會產(chǎn)生離屏渲染 怎么檢測 所有的UI都會產(chǎn)生離屏渲染嗎良哲?為什么盛卡?
- 如何設(shè)計出一個復(fù)雜的頁面?
- 使用autolayout是否會造成卡頓筑凫,為什么滑沧?怎么解決?
- 你是怎么做性能優(yōu)化的巍实?
- 項目中單例多嗎滓技?單例過多的話你怎么處理?
- 包瘦身是怎么做的棚潦?比如刪除無用圖片 壓縮圖片以及刪除無用文件
- 怎么刪除無用文件的令漂?怎么判斷方法是否使用以及類是否使用
- mach-o是干嘛用的?
- bitcode是做什么的?
- 假設(shè)你使用的是友盟叠必,友盟是怎么根據(jù)我們的崩潰信息定位到崩潰代碼位置的荚孵?
- 模塊化 組件化問題
- 項目為什么使用模塊化 組件化 他們有什么不同,有什么優(yōu)缺點
- apns相關(guān)
- 你了解過第三方推送嗎?第三方例如極光是怎么實現(xiàn)消息推送的纬朝?應(yīng)用殺死的時候和應(yīng)用處于后臺以及前臺的時候收叶,傳輸方式有什么不同?apns和socket有什么不同玄组?
- runloop和runtime相關(guān)
- runloop的啟動以及退出方式有哪些滔驾?
- 談?wù)勀銓untime和runloop的理解。
- 定時器相關(guān)
- NSTimer為什么是不準(zhǔn)確的俄讹?你還知道哪些定時器哆致?他們的各自使用場景有哪些?
- jpg和png有什么區(qū)別患膛?
- 網(wǎng)絡(luò)相關(guān)
- http和https有什么不同 他們是怎么建立起鏈接的摊阀?
- tcp 和udp有什么不同
- 抓包的原理是什么?如何避免自己的app不被別人抓包
- 談?wù)勀銓ocket有什么看法
- 假如app由登錄模式變?yōu)橛慰湍J阶俚牛绾稳∠卿浤J较碌恼埱蠡蛉蝿?wù)胞此,你有什么方案?
- 底層原理相關(guān)
- 你有沒有看過gcd的源碼跃捣,談?wù)勀銓cdglobal的看法
- 如果讓你實現(xiàn)一個kvo你怎么實現(xiàn)漱牵?有哪些需要注意的點。第三方開源的KVOController和kvo比有什么優(yōu)缺點疚漆。rac中的addobserver原理是什么酣胀?
- 三方庫源碼相關(guān):
- 如果要你設(shè)計一個網(wǎng)絡(luò)框架你怎么設(shè)計?
- 如果要你設(shè)計一個圖片緩存框架你怎么設(shè)計娶聘?
- flutter問題
- 為什么flutter可以hotrelaod 而oc不可以闻镶?如果oc要實現(xiàn)hot reload你認(rèn)為有什么技術(shù)難度?
- java問題
- 在oc中如何實現(xiàn)java接口的功能
面試題-C公司
面試題:
- 屬性關(guān)鍵字相關(guān)
- 你都使用過哪些屬性關(guān)鍵字丸升?
- atomic實現(xiàn)原理是什么铆农?他是怎么保證安全的?
- 如果用readonly修飾系統(tǒng)會自動為當(dāng)前屬性生成setter和getter方法嗎狡耻?
- 用strong修飾符修飾的有哪些墩剖?如果改為copy會有什么隱患?
- @dynamic @synthesize 有什么區(qū)別夷狰?他們的應(yīng)用場景在哪里涛碑?(系統(tǒng)會自動為我們生成setter和getter方法嗎?)
- 內(nèi)存管理相關(guān)
- 談?wù)刴rc和arc下的copy
- mrc和arc混編的時候 如果mrc要調(diào)用arc中的block 要怎么處理孵淘?
- 對象什么時候會被釋放?如果對象在應(yīng)該釋放的時候沒有釋放歹篓,有哪些可能瘫证?
- 談?wù)刬OS是怎么實現(xiàn)引用計數(shù)機制的揉阎?
- dealloc方法的執(zhí)行步驟有哪些?
- category 和extention 有什么區(qū)別背捌?
- 對代理添加屬性的時候毙籽,系統(tǒng)會為我們自動生成setter和getter方法嗎?
- +load和+initialize有什么不同 他們都應(yīng)用在哪個場景毡庆?假如分類和當(dāng)前類都有l(wèi)oad方法那么方法的執(zhí)行順序是怎么樣的坑赡?如果當(dāng)前類和分類中都有initialize方法執(zhí)行順序又是什么樣呢?如果有多個分類呢么抗?
- 假如當(dāng)前類和分類中有相同方法名的方法毅否,他們的執(zhí)行順序是什么樣的呢?為什么蝇刀?如果想要執(zhí)行方法的時候優(yōu)先執(zhí)行當(dāng)前類的方法你怎么處理螟加?
- 通過關(guān)聯(lián)對象生成的屬性,它是當(dāng)前類維護(hù)還是應(yīng)用統(tǒng)一來維護(hù)吞琐?關(guān)聯(lián)對象什么時候被釋放捆探?
- 集合相關(guān)深拷貝和淺拷貝以及集合對象的實現(xiàn)原理。假如10000條數(shù)據(jù)需要存儲并且需要查詢站粟,你會選用數(shù)組還是字典還是集合黍图。為什么?集合和字典的實現(xiàn)方式有什么區(qū)別奴烙?
- 生命周期相關(guān) UIViewController的生命周期都會執(zhí)行哪些方法助被?從A視圖push到B視圖的時候 A會執(zhí)行哪些方法 B會執(zhí)行哪些方法?
- VC上有一個按鈕點擊按鈕原本是要跳轉(zhuǎn)到下一個頁面的缸沃,但是現(xiàn)在事件不響應(yīng)了恰起,有哪些原因造成的。
- UIView和CALayer有什么區(qū)別趾牧?他們之間分工不同检盼,符合哪一個設(shè)計原則?
- 循環(huán)引用相關(guān)
- 談?wù)勀銓ρh(huán)引用的理解翘单?哪些場景會產(chǎn)生循環(huán)引用
- 數(shù)據(jù)存儲相關(guān)
- 你都用過哪些數(shù)據(jù)存儲方式吨枉?他們各自的應(yīng)用場景有哪些?他們有什么不同哄芜?NSUserDefaults 歸檔接檔 plist 數(shù)據(jù)庫
- 數(shù)據(jù)庫相關(guān)
- 一些簡單的數(shù)據(jù)庫查詢語句 條件查詢等 以及表創(chuàng)建應(yīng)該怎么寫
- 如果數(shù)據(jù)庫需要更新100w條數(shù)據(jù)你有什么方法進(jìn)行更新
- FMDB 是怎么實現(xiàn)事務(wù)的貌亭?談?wù)勀銓κ聞?wù)的理解。
- 網(wǎng)絡(luò)相關(guān)
- http請求的cache你是怎么用的认臊?實例:假如我有一個請求圃庭,如果服務(wù)端數(shù)據(jù)不變的時候我不再進(jìn)行UI處理了,這個怎么解決?
- 關(guān)于https的握手和揮手談?wù)勀愕睦斫狻?br> 面試題-D公司
面試題:
- 你是怎么做性能優(yōu)化的(這個有點寬泛剧腻,可以從內(nèi)存上拘央,啟動速度上,檢測內(nèi)存泄漏以及卡頓上來說)你用什么工具來檢測的书在,檢測的原理是什么灰伟?有沒有做一些自動化的檢測處理。
- 你是怎么處理包瘦身的儒旬?
- 如何處理才能讓app省電栏账。你是怎么檢測到耗電的?有以下場景:有個地方要頻繁的去請求栈源,你怎么處理挡爵?
- 卡頓的原因是什么?你怎么去處理和定位卡頓的問題凉翻。
- 如果讓你設(shè)計一個埋點統(tǒng)計的方案你會怎么處理了讨?
- swift和oc相比有什么優(yōu)缺點。你認(rèn)為swift比oc打包體積大的原因是什么制轰?
- 假如現(xiàn)在數(shù)據(jù)庫中有100w條數(shù)據(jù)前计。這些數(shù)據(jù)需要更新現(xiàn)在有200w條數(shù)據(jù)你怎么能查出相同的和不同的數(shù)據(jù)。實現(xiàn)更新和插入操作垃杖。
- iOS13有什么新功能男杈?你是怎么處理劉海屏的適配以及深色模式的。
- wwdc你平车鞣看嗎伶棒?講一下最新的一些技術(shù)。你學(xué)習(xí)的途徑有哪些彩库?
- 遇到技術(shù)問題你是通過哪些途徑解決的肤无?
- 你是怎么做代碼管理的?
答案:
你認(rèn)為NSDictionary是怎么實現(xiàn)的骇钦?
一宛渐、NSDictionary使用原理
1.NSDictionary(字典)是使用hash表來實現(xiàn)key和value之間的映射和存儲的,hash函數(shù)設(shè)計的好壞影響著數(shù)據(jù)的查找訪問效率眯搭。
- (void)setObject:(id)anObject forKey:(id)aKey;
2.Objective-C中的字典NSDictionary底層其實是一個哈希表窥翩,實際上絕大多數(shù)語言中字典都通過哈希表實現(xiàn),
二鳞仙、哈希的原理
哈希概念:哈希表的本質(zhì)是一個數(shù)組寇蚊,數(shù)組中每一個元素稱為一個箱子(bin),箱子中存放的是鍵值對棍好。
三仗岸、哈希表的存儲過程:
1.根據(jù)key計算出它的哈希值h允耿。
2.假設(shè)箱子的個數(shù)為n,那么這個鍵值對應(yīng)該放在第(h % n)個箱子中爹梁。
3.如果該箱子中已經(jīng)有了鍵值對右犹,就使用開放尋址法或者拉鏈法解決沖突。
在使用拉鏈法解決哈希沖突時姚垃,每個箱子其實是一個鏈表,屬于同一個箱子的所有鍵值對都會排列在鏈表中盼忌。
哈希表還有一個重要的屬性:負(fù)載因子(load factor)积糯,它用來衡量哈希表的空/滿程度,一定程度上也可以體現(xiàn)查詢的效率谦纱,計算公式為:
負(fù)載因子=總鍵值對數(shù)/箱子個數(shù)
負(fù)載因子越大看成,意味著哈希表越滿,越容易導(dǎo)致沖突跨嘉,性能也就越低川慌。因此,一般來說祠乃,當(dāng)負(fù)載因子大于某個常數(shù)(可能是1梦重,或者0.75等)時,哈希表將自動擴容亮瓷。
重哈希概念:
哈希表在自動擴容時琴拧,一般會創(chuàng)建兩倍于原來個數(shù)的箱子,因此即使key的哈希值不變嘱支,對箱子個數(shù)取余的結(jié)果也會發(fā)生改變蚓胸,因此所有鍵值對的存放位置都有可能發(fā)生改變,這個過程也稱為重哈希(rehash)除师。
哈希表的擴容并不總是能夠有效解決負(fù)載因子過大的問題沛膳。假設(shè)所有key的哈希值都一樣,那么即使擴容以后他們的位置也不會變化汛聚。雖然負(fù)載因子會降低锹安,但實際存儲在每個箱子中的鏈表長度并不發(fā)生改變,因此也就不能提高哈希表的查詢性能贞岭。
四八毯、總結(jié),細(xì)心的讀者可能會發(fā)現(xiàn)哈希表的兩個問題:
1.如果哈希表中本來箱子就比較多瞄桨,擴容時需要重新哈希并移動數(shù)據(jù)话速,性能影響較大。
2.如果哈希函數(shù)設(shè)計不合理芯侥,哈希表在極端情況下會變成線性表泊交,性能極低乳讥。
出處鏈接:http://www.reibang.com/p/d7e4c902e1df