ios經(jīng)典面試(三)

我有過不少面試和被面試的經(jīng)歷,作為面試官出這份面試題從來就不是為了難倒面試者,而是為了多角度全面的了解面試者從而建立信任。面試的時候最擔(dān)心的是冷場,面試題只不過個引子,我心底里最希望遇到的面試者是能夠舉一反三,除了回答問題本身之外,還能自信的旁征博引,深談其背后原理或者相關(guān)的知識理論的。問題本身反而并不怎么重要。這份清單里的問題也并不難,這里我列下我的回答以及從我的角度所期望的答案。

什么是arc?(arc是為了解決什么問題誕生的?)

現(xiàn)在有不少程序員是直接從arc上手的,從沒接觸過mrc,對arc的理解僅僅停留在apple幫助管理內(nèi)存的層面。這個問題真正想了解的是對內(nèi)存管理的理解,retain release雖然不用寫了,但arc下還是會有內(nèi)存泄漏野指針crash的bug存在。如果能從retain count這種內(nèi)存管理策略的角度去闡述arc誕生的意義就算答對了。如果還能扯下其他類型的策略,比如java里的mark and sweep,那就加分點(diǎn)贊。

請解釋以下keywords的區(qū)別: assign vs weak, __block vs __weak

這道題屬于基礎(chǔ)語法題,可以網(wǎng)上搜到答案。不過真有不少同學(xué)不知道weak在對象釋放后會置為nil。__block關(guān)鍵字的理解稍微難點(diǎn),因?yàn)樵赼rc和mrc下含義(對retain count的影響)完全不同。理解了這幾個關(guān)鍵字就能應(yīng)付使用block時引入retain cycle的風(fēng)險了。這題還在內(nèi)存管理的范疇之內(nèi)。

使用atomic一定是線程安全的嗎?

看這題的問法不用想答案肯定是NO。有些人說不出所以然,有些人知道通過property的方式使用才能保證安全,還有人知道這個用來做多線程安全會有性能損耗,更有出色的候選人能談atomic,synchronized,NSLock,pthread mutex,OSSpinLock的差別。好奇寶寶點(diǎn)我。

描述一個你遇到過的retain cycle例子。(別撒謊,你肯定遇到過)

說沒遇到過的我很難相信你有過成熟項(xiàng)目的經(jīng)歷。這題答不出了會扣很多很多分。用過block,寫過delegate的肯定都踩過坑。

+(void)load; +(void)initialize;有什么用處?

這題屬于runtime范疇,我遇到過能說出對runtime的理解卻不知道這兩個方法的候選人。所以答不出來也沒關(guān)系,這屬于細(xì)節(jié)知識點(diǎn),是加分項(xiàng),能答出兩個message各在什么階段接收就可以了。

為什么其他語言里叫函數(shù)調(diào)用, objective c里則是給對象發(fā)消息(或者談下對runtime的理解)

這題考查的是objective c這門語言的dynamic特性,需要對比c++這類傳統(tǒng)靜態(tài)方法調(diào)用才能理解。最好能說出一個對象收到message之后的完整的流程是如何的。對runtime有完整理解的候選人還能說出oc的對象模型。

什么是method swizzling?

說了解runtime但沒聽過method swizzling是騙人的。這題很容易搜到答案。定位一些疑難雜癥bug,hack老項(xiàng)目實(shí)現(xiàn),閱讀第三方源碼都有機(jī)會接觸到這個概念。

UIView和CALayer是啥關(guān)系?

能答出UIView是CALayer的delegate就及格了,能說出UIView主要處理事件,CALayer負(fù)責(zé)繪制就更好,再聊下二者在使用過程中對動畫流暢性影響的注意點(diǎn)就superb。UI流暢性是個大話題,推薦看下這兩篇文章。中餐,西餐。

如何高性能的給UIImageView加個圓角?(不準(zhǔn)說layer.cornerRadius!)

這題討論的最多,還有說美工切圖就搞定的。答主在項(xiàng)目里做過圓角頭像的處理,里面的坑還真不少。cornerRadius會導(dǎo)致offscreen drawing有性能問題,美工切圖無法適用有背景圖的場景,即使加上shouldRasterize也有cache實(shí)效問題。正確的做法是切換到工作線程利用CoreGraphic API生成一個offscreen UIImage,再切換到main thread賦值給UIImageView。這里還涉及到UIImageView復(fù)用,圓角頭像cache緩存(不能每次都去繪制),新舊頭像替換等等邏輯。還有其他的實(shí)現(xiàn)方式,但思路離不開工作線程與主線程切換。

使用drawRect有什么影響?(這個可深可淺,你至少得用過。。)

不少同學(xué)都用過drawRect或者看別人用過,但不知道這個api存在的含義。這不僅僅是另一種做UI的方式。drawRect會利用CPU生成offscreen bitmap,從而減輕GPU的繪制壓力,用這種方式最UI可以將動畫流暢性優(yōu)化到極致,但缺點(diǎn)是繪制api復(fù)雜,offscreen cache增加內(nèi)存開銷。UI動畫流暢性的優(yōu)化主要平衡CPU和GPU的工作壓力。推薦一篇文章:西餐

ASIHttpRequest或者SDWebImage里面給UIImageView加載圖片的邏輯是什么樣的?(把UIImageView放到UITableViewCell里面問更贊)

很多同學(xué)沒有讀源碼的習(xí)慣,別人的輪子拿來只是用用卻不知道真正的營養(yǎng)都在源代碼里面。這兩個經(jīng)典的framework代碼并不復(fù)雜,很值得一讀。能對一個UIImageView怎么通過url展示一張圖片有完整的理解。涉及到的知識點(diǎn)也非常多,UITableViewCell的復(fù)用,memory cache, disk cache, 多線程切換,甚至http協(xié)議本身都需要有一定的涉及。

麻煩你設(shè)計個簡單的圖片內(nèi)存緩存器(移除策略是一定要說的)

內(nèi)存緩存是個通用話題,每個平臺都會涉及到。cache算法會影響到整個app的表現(xiàn)。候選人最好能談下自己都了解哪些cache策略及各自的特點(diǎn)。常見的有FIFO,LRU,LRU-2,2Q等等。由于NSCache的緩存策略不透明,一些app開發(fā)者會選擇自己做一套cache機(jī)制,其實(shí)并不難。

講講你用Instrument優(yōu)化動畫性能的經(jīng)歷吧(別問我什么是Instrument)

Apple的instrument為開發(fā)者提供了各種template去優(yōu)化app性能和定位問題。很多公司都在趕feature,并沒有充足的時間來做優(yōu)化,導(dǎo)致不少開發(fā)者對instrument不怎么熟悉。但這里面其實(shí)涵蓋了非常完整的計算機(jī)基礎(chǔ)理論知識體系,memory,disk,network,thread,cpu,gpu等等,順藤摸瓜去學(xué)習(xí),是一筆巨大的知識財富。動畫性能只是其中一個template,重點(diǎn)還是理解上面問題當(dāng)中CPU GPU如何配合工作的知識。

loadView是干嘛用的?

不要就簡單的告訴我沒用過,至少問下我有什么用。。這里是apple給開發(fā)者自己設(shè)置custom view的位置。說UI熟悉的一定要知道。

viewWillLayoutSubView你總是知道的。。

controller layout觸發(fā)的時候,開發(fā)者有機(jī)會去重新layout自己的各個subview。說UI熟悉的一定要知道。

GCD里面有哪幾種Queue?你自己建立過串行queue嗎?背后的線程模型是什么樣的?

兩種queue,串行和并行。main queue是串行,global queue是并行。有些開發(fā)者為了在工作線程串行的處理任務(wù)會自己建立一個serial queue。背后是蘋果維護(hù)的線程池,各種queue要用線程都是這個池子里取的。GCD大家都用過,但很多關(guān)鍵的概念不少人都理解的模凌兩可。串行,并行,同步,異步是GCD的核心概念。

用過coredata或者sqlite嗎?讀寫是分線程的嗎?遇到過死鎖沒?咋解決的?

沒用過sqlite是說不過去的。用過CoreData的肯定有很多血淚史要說。多謝線程模型你肯定做過比較選擇。死鎖是啥肯定也是要知道的,沒遇到過至少能舉個簡單的例子來說明。單個線程可以死鎖(main thread里dispatch_sync到main queue),多個線程直接也可以死鎖(A,B線程互相持有對方需要的資源且互相等待)。

http的post和get啥區(qū)別?(區(qū)別挺多的,麻煩多說點(diǎn))

這個可以說很多。不希望聽到的答案有

兩個差不多,隨便用一個。

post比get安全(其實(shí)兩個都不安全)

能說下兩個http格式有什么不同,各自應(yīng)用的場景就合格了。更多可以閱讀下這個答案。

我知道你大學(xué)畢業(yè)過后就沒接觸過算法數(shù)據(jù)結(jié)構(gòu)了,但是請你一定告訴我什么是Binary search tree? search的時間復(fù)雜度是多少?我很想知道!

很多人都很排斥數(shù)據(jù)結(jié)構(gòu)和算法題,我個人意見是復(fù)雜的可以不知道,基礎(chǔ)的一定要了解。時間復(fù)雜度是什么得知道,list,queue,stack,table,tree這些都要明白是啥。連hash表的概念都不知道怎么能保證在寫代碼的時候注意性能呢。

隱藏關(guān)卡??

其實(shí)當(dāng)初寫這份答案的時候并沒有準(zhǔn)備什么隱藏關(guān)卡,只不過有一些從自己這些年項(xiàng)目經(jīng)歷里總結(jié)出來的有深度的知識點(diǎn),感覺可以難倒不少同學(xué):p。求隱藏關(guān)卡的同學(xué)真不少,近期我會再準(zhǔn)備一份進(jìn)階版面試題,權(quán)當(dāng)作隱藏關(guān)卡。面向的對象是3~5年iOS開發(fā)經(jīng)驗(yàn)的同學(xué)。再次申明下:這只是一份面試題。

看到這個題目是一個群里的朋友發(fā)的,感謝那個兄弟,看到MrPeak大大出的題目啊 好開心,試著答,各位大大請輕噴,剛好不怎么忙,帶著耳機(jī)聽歌,答了一個小時,真舒服啊,看到這些題目好多都不怎么知道,惡補(bǔ),學(xué)習(xí)。

1.NSString如何計算字符的個數(shù)?

應(yīng)該是用countElements的函數(shù)來統(tǒng)計字符串所包含的字符個數(shù),把參數(shù)為要統(tǒng)計的字符串就好了。

但是需要注意以下的幾個點(diǎn):

1.因?yàn)椴煌腢nicode字符,同樣的字符不同的編碼都可能導(dǎo)致占用不同的內(nèi)存。所以按正常來說,字符串中的每個字符會占用不同的內(nèi)存。因此,只能通過遍歷字符串中的每個字符來計算字符串的長度。但是當(dāng)在處理一個特別長的字符串的話,可以通過遍歷遍歷整個字符串,這樣既可以算出字符串的長度了。

2.同一個字符串,countElements計算出來的字符個數(shù)與NSString的length計算出來的長度也不一定總是一樣的的。因?yàn)镹SString的長度是基UTF-16編碼的編碼來計算的,而不是Unicode編碼的個數(shù)。但是,好像在Swift中可以使用字符串的utf16count屬性來來獲得原來NSString的length值,忘記了,很久沒用Swift了。

2.PKI體系當(dāng)中加密和簽名有什么區(qū)別?

這個問題我來答的話,應(yīng)該先說說PKI是一種安全技術(shù), 數(shù)字簽名和加密基本原理是什么,在說區(qū)別,話說基本原理我也不記得了,就大概記得一個HUSH函數(shù)什么的了,他們的過程都是使用公開密鑰體系,但實(shí)現(xiàn)的過程是不同的,相反,使用的密鑰對也不同。

1.數(shù)字簽名是發(fā)送方的密鑰對,發(fā)送方用自己的私有密鑰進(jìn)行加密,接收方用發(fā)送方的公開密鑰進(jìn)行解密,大致就是這樣吧,它一個一對多的關(guān)系,任何擁有發(fā)送方公開密鑰的人都可以驗(yàn)證數(shù)字簽名的正確性,還有只采用了非對稱密鑰加密算法,能保證發(fā)送信息的完整性、身份認(rèn)證和不可否認(rèn)性。

2.數(shù)字加密是接收方的密鑰對,這是多對一的關(guān)系,任何知道接收方公開密鑰的人都可以向接收方發(fā)送加密信息,只有唯一擁有接收方私有密鑰的人才能對信息解密,用的對稱密鑰加密算法和非對稱密鑰加密算法相結(jié)合的方法,它能保證發(fā)送信息保密性。

3.如何自己高效實(shí)現(xiàn)NSUserDefault?

這個,真心不知道,peak大大。只知道NSUserDefaults是定時把緩存中的數(shù)據(jù)寫入磁盤的,而不是即時寫入,為了防止在寫完NSUserDefaults后程序退出導(dǎo)致的數(shù)據(jù)丟失,可以在寫入數(shù)據(jù)后使用synchronize強(qiáng)制立即將數(shù)據(jù)寫入磁盤,現(xiàn)在要高效的實(shí)現(xiàn)NSUserDefaults,個人見解就是不頻繁的使用synchornize,自定義一個類,再存取時通過NSData做載體。

4.解釋下tcp的慢啟動特性。

現(xiàn)在公司應(yīng)該都是在避免慢啟動,做性能優(yōu)化吧,優(yōu)化應(yīng)該可以盡量把大量小文件放在一個TCP連接中排隊(duì)傳輸吧,沒試驗(yàn)過,自己YY的。

這問的是Tcp慢啟動的特點(diǎn),難道就是它在新建立的連接不能夠一開始就發(fā)送大尺寸的數(shù)據(jù)包,而只能從一個小尺寸的包開始發(fā)送,在發(fā)送和數(shù)據(jù)被對方確認(rèn)的過程中去計算對方的接收速度,來逐步增加每次發(fā)送的數(shù)據(jù)量,但是這樣的話 性能呢,請科普下,謝謝。

5.如何用HTTP實(shí)現(xiàn)長連接?

首先HTTP是無狀態(tài)的,要維持一個長連接可以用心跳包啊,公司項(xiàng)目第一個版本就是這樣用的,然后各種原因,各種呵呵呵,丟包,沾包,應(yīng)該可以對http連接進(jìn)行輪詢,但是http定時輪詢會存在延遲 用戶體驗(yàn)就不好了 或者用socket流方法,監(jiān)聽服務(wù)器消息

6.HTTP2.0針對同一個域名的多個請求,會建立多少個tcp連接?

一個嗎?不是很清楚啊。

7.數(shù)據(jù)庫建表的時候索引有什么用?

創(chuàng)建索引可以大大提高系統(tǒng)的性能,加快數(shù)據(jù)的檢索速度,加速表和表之間的連接,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性,但是有些列不應(yīng)該創(chuàng)建索引,這又要考慮到性能了,所以具體情況具體分析了。

8.Full Text Search為什么快?

這我不是后臺不是很了解,問題偏后臺系統(tǒng)多一點(diǎn)點(diǎn)了,但是自己會寫一點(diǎn)點(diǎn)PHP,好像是用空間來換時間,通過分詞器,降索引的表分割啥的,不是很清楚原理啊,看來要系統(tǒng)學(xué)下后臺語言。

9.iOS下如何實(shí)現(xiàn)指定線程數(shù)目的線程池?

這個問題問的太深了吧,一般開發(fā)根本用不到,還好最近在看線程安全方面的書籍,要不然問到真的會懵逼。

1.循環(huán)通過pthread_create創(chuàng)建線程,創(chuàng)建s_tfthread對象做為線程句,加入線程數(shù)組,s_tftask_content->methord初始化為空函數(shù)

2.創(chuàng)建任務(wù)執(zhí)行函數(shù),執(zhí)行完通過task初始化函數(shù)后,在執(zhí)行函數(shù)中通過pthread_cond_wait信號將當(dāng)前創(chuàng)建的線程掛起

3.創(chuàng)建完之后,程序中將會有n個掛起狀態(tài)的線程,當(dāng)需要執(zhí)行新的task的時候查找,我們就可以根據(jù)不同的task標(biāo)志在k_threads中查詢出空閑線程,并創(chuàng)建新的s_tftask_content加入s_tfthread的任務(wù)列表,通過pthread_cond_signal重新喚醒該線程繼續(xù)執(zhí)行任務(wù)

10.介紹下iOS設(shè)備獲取唯一設(shè)備號的歷史變遷。

這個沒做過幾年開發(fā)的真心不知道,iOS中獲取設(shè)備唯一標(biāo)示符的方法一直隨版本的更新而變化。iOS 2.0版本以后UIDevice提供一個獲取設(shè)備唯一標(biāo)識符的方法uniqueIdentifier,但是好像是iOS 4還是iOS5就被蘋果廢棄掉了,然后iOS6是用WiFi的mac地址來獲取的,iOS7后大家都知道了,主要是由于蘋果又坑爹了,封殺mac地址,但是推薦大家用KeyChain來保存獲取到的UDID,因?yàn)锳PP刪了再裝回來,也可以從KeyChain中讀取回來,哈哈,公司的項(xiàng)目都是把UDID存在KeyChain。

11.函數(shù)式編程當(dāng)中的 first-class function是什么意思呢?

這個問題好像以前就在知乎看過,就是類型,定義了一個可以操作的取值的集合,就像C語言的int類型一樣,可進(jìn)行加減乘除等操作,但是它的設(shè)計又有一個模塊復(fù)用和訪存控制,這樣設(shè)計的原因應(yīng)該是讓我們更好用吧,沒有深究過這個。

12.如何使用runtime hook一個class的某個方法,又如何hook某個instance的方法?

做到這里在電腦碼字快三十分鐘了啊,peak大大,你問的問題都好難回答啊,要分各種情況。這題也是首先要考慮 hook是否有公開頭文件的類,有的話寫一個Utility函數(shù),再使用category,沒有的話就建一個類作為新函數(shù)載體,然后先為被hook的類增加函數(shù),再替換,沒錯就是這個樣子。后面如何h如何hook某個instance的方法,應(yīng)該可以定義一個函數(shù)指針變量,hook時將要調(diào)用的地址賦給這個變量,調(diào)用時把這個變量當(dāng)作函數(shù)來用就行了。

13.談下Objective C都有哪些鎖機(jī)制,你一般用哪個?

synchronized、NSLOCK、GCD、遞歸鎖、分布鎖、同步鎖(這個是C語言的),一般用GCD,這里就不說了,真心不想碼字了,peak大大可能會問,為什么,又要把各種鎖機(jī)制對比,這我會瘋,我腦袋要死機(jī)了,重啟中…

14.聊下HTTP post的body體使用form-urlencoded和multipart/form-data的區(qū)別。

http定義了與服務(wù)器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE,剛好公司上個項(xiàng)目都用了這四種方式的請求,怎么都是踩過得坑。

form-urlencoded是默認(rèn)的mime內(nèi)容編碼類型,是通用的,但是它在傳輸比較大的二進(jìn)制或者文本數(shù)據(jù)時效率極低。

multipart/form-data是當(dāng)上傳文件或者二進(jìn)制數(shù)據(jù)和非ASCII數(shù)據(jù)使用。

15.讓你設(shè)計一種機(jī)制檢測UIViewController的內(nèi)存泄漏,你會怎么做?

這個問題沒有考慮過,都是自己寫單元測試什么的來測試,都是些基礎(chǔ)的測試,一般都是用Instrument來測試一些東西的。自己設(shè)計的話,主要還是要考慮一個VC的生命周期。

16.通過[UIImage imageNamed:]生成的對象什么時候被釋放?

應(yīng)該是到@autoreleasepool 結(jié)束的時候才釋放的,但是我都是用這imageWithContentsOfFile方法加載圖片的

17.applicationWillEnterForeground和applicationDidBecomeActive都會在哪些場景下被調(diào)用?舉例越多越好。

推送、做支付的時候,跳到人家運(yùn)用,后臺殺進(jìn)程的時候、做IM的時候、第三方授權(quán)分享登錄回調(diào)情況下等等

18.如何終止正在運(yùn)行的工作線程?

在線程中調(diào)用exit、pthread_exit、pthread_kill、pthread_cance都行吧

19.窮舉iOS下所有的本地持久化方案。

沙盒

plist文件(屬性列表)

preference(偏好設(shè)置)

NSKeyedArchiver(歸檔)

SQLite 3

CoreData

還有請補(bǔ)充...

20.如果公司強(qiáng)制996,你有什么心里話要對老板說嗎?

沒什么話,習(xí)慣了,主要想要對產(chǎn)品經(jīng)理說你的需求能不能想好在做,不要瞎搞,謝謝??吹竭@個題目是一個群里的朋友發(fā)的,感謝那個兄弟,看到MrPeak大大出的題目啊 好開心,試著答,各位大大請輕噴,剛好不怎么忙,帶著耳機(jī)聽歌,答了一個小時,真舒服啊,看到這些題目好多都不怎么知道,惡補(bǔ),學(xué)習(xí)。

1.NSString如何計算字符的個數(shù)?

應(yīng)該是用countElements的函數(shù)來統(tǒng)計字符串所包含的字符個數(shù),把參數(shù)為要統(tǒng)計的字符串就好了。

但是需要注意以下的幾個點(diǎn):

1.因?yàn)椴煌腢nicode字符,同樣的字符不同的編碼都可能導(dǎo)致占用不同的內(nèi)存。所以按正常來說,字符串中的每個字符會占用不同的內(nèi)存。因此,只能通過遍歷字符串中的每個字符來計算字符串的長度。但是當(dāng)在處理一個特別長的字符串的話,可以通過遍歷遍歷整個字符串,這樣既可以算出字符串的長度了。

2.同一個字符串,countElements計算出來的字符個數(shù)與NSString的length計算出來的長度也不一定總是一樣的的。因?yàn)镹SString的長度是基UTF-16編碼的編碼來計算的,而不是Unicode編碼的個數(shù)。但是,好像在Swift中可以使用字符串的utf16count屬性來來獲得原來NSString的length值,忘記了,很久沒用Swift了。

2.PKI體系當(dāng)中加密和簽名有什么區(qū)別?

這個問題我來答的話,應(yīng)該先說說PKI是一種安全技術(shù), 數(shù)字簽名和加密基本原理是什么,在說區(qū)別,話說基本原理我也不記得了,就大概記得一個HUSH函數(shù)什么的了,他們的過程都是使用公開密鑰體系,但實(shí)現(xiàn)的過程是不同的,相反,使用的密鑰對也不同。

1.數(shù)字簽名是發(fā)送方的密鑰對,發(fā)送方用自己的私有密鑰進(jìn)行加密,接收方用發(fā)送方的公開密鑰進(jìn)行解密,大致就是這樣吧,它一個一對多的關(guān)系,任何擁有發(fā)送方公開密鑰的人都可以驗(yàn)證數(shù)字簽名的正確性,還有只采用了非對稱密鑰加密算法,能保證發(fā)送信息的完整性、身份認(rèn)證和不可否認(rèn)性。

2.數(shù)字加密是接收方的密鑰對,這是多對一的關(guān)系,任何知道接收方公開密鑰的人都可以向接收方發(fā)送加密信息,只有唯一擁有接收方私有密鑰的人才能對信息解密,用的對稱密鑰加密算法和非對稱密鑰加密算法相結(jié)合的方法,它能保證發(fā)送信息保密性。

3.如何自己高效實(shí)現(xiàn)NSUserDefault?

這個,真心不知道,peak大大。只知道NSUserDefaults是定時把緩存中的數(shù)據(jù)寫入磁盤的,而不是即時寫入,為了防止在寫完NSUserDefaults后程序退出導(dǎo)致的數(shù)據(jù)丟失,可以在寫入數(shù)據(jù)后使用synchronize強(qiáng)制立即將數(shù)據(jù)寫入磁盤,現(xiàn)在要高效的實(shí)現(xiàn)NSUserDefaults,個人見解就是不頻繁的使用synchornize,自定義一個類,再存取時通過NSData做載體。

4.解釋下tcp的慢啟動特性。

現(xiàn)在公司應(yīng)該都是在避免慢啟動,做性能優(yōu)化吧,優(yōu)化應(yīng)該可以盡量把大量小文件放在一個TCP連接中排隊(duì)傳輸吧,沒試驗(yàn)過,自己YY的。

這問的是Tcp慢啟動的特點(diǎn),難道就是它在新建立的連接不能夠一開始就發(fā)送大尺寸的數(shù)據(jù)包,而只能從一個小尺寸的包開始發(fā)送,在發(fā)送和數(shù)據(jù)被對方確認(rèn)的過程中去計算對方的接收速度,來逐步增加每次發(fā)送的數(shù)據(jù)量,但是這樣的話 性能呢,請科普下,謝謝。

5.如何用HTTP實(shí)現(xiàn)長連接?

首先HTTP是無狀態(tài)的,要維持一個長連接可以用心跳包啊,公司項(xiàng)目第一個版本就是這樣用的,然后各種原因,各種呵呵呵,丟包,沾包,應(yīng)該可以對http連接進(jìn)行輪詢,但是http定時輪詢會存在延遲 用戶體驗(yàn)就不好了 或者用socket流方法,監(jiān)聽服務(wù)器消息

6.HTTP2.0針對同一個域名的多個請求,會建立多少個tcp連接?

一個嗎?不是很清楚啊。

7.數(shù)據(jù)庫建表的時候索引有什么用?

創(chuàng)建索引可以大大提高系統(tǒng)的性能,加快數(shù)據(jù)的檢索速度,加速表和表之間的連接,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性,但是有些列不應(yīng)該創(chuàng)建索引,這又要考慮到性能了,所以具體情況具體分析了。

8.Full Text Search為什么快?

這我不是后臺不是很了解,問題偏后臺系統(tǒng)多一點(diǎn)點(diǎn)了,但是自己會寫一點(diǎn)點(diǎn)PHP,好像是用空間來換時間,通過分詞器,降索引的表分割啥的,不是很清楚原理啊,看來要系統(tǒng)學(xué)下后臺語言。

9.iOS下如何實(shí)現(xiàn)指定線程數(shù)目的線程池?

這個問題問的太深了吧,一般開發(fā)根本用不到,還好最近在看線程安全方面的書籍,要不然問到真的會懵逼。

1.循環(huán)通過pthread_create創(chuàng)建線程,創(chuàng)建s_tfthread對象做為線程句,加入線程數(shù)組,s_tftask_content->methord初始化為空函數(shù)

2.創(chuàng)建任務(wù)執(zhí)行函數(shù),執(zhí)行完通過task初始化函數(shù)后,在執(zhí)行函數(shù)中通過pthread_cond_wait信號將當(dāng)前創(chuàng)建的線程掛起

3.創(chuàng)建完之后,程序中將會有n個掛起狀態(tài)的線程,當(dāng)需要執(zhí)行新的task的時候查找,我們就可以根據(jù)不同的task標(biāo)志在k_threads中查詢出空閑線程,并創(chuàng)建新的s_tftask_content加入s_tfthread的任務(wù)列表,通過pthread_cond_signal重新喚醒該線程繼續(xù)執(zhí)行任務(wù)

10.介紹下iOS設(shè)備獲取唯一設(shè)備號的歷史變遷。

這個沒做過幾年開發(fā)的真心不知道,iOS中獲取設(shè)備唯一標(biāo)示符的方法一直隨版本的更新而變化。iOS 2.0版本以后UIDevice提供一個獲取設(shè)備唯一標(biāo)識符的方法uniqueIdentifier,但是好像是iOS 4還是iOS5就被蘋果廢棄掉了,然后iOS6是用WiFi的mac地址來獲取的,iOS7后大家都知道了,主要是由于蘋果又坑爹了,封殺mac地址,但是推薦大家用KeyChain來保存獲取到的UDID,因?yàn)锳PP刪了再裝回來,也可以從KeyChain中讀取回來,哈哈,公司的項(xiàng)目都是把UDID存在KeyChain。

11.函數(shù)式編程當(dāng)中的 first-class function是什么意思呢?

這個問題好像以前就在知乎看過,就是類型,定義了一個可以操作的取值的集合,就像C語言的int類型一樣,可進(jìn)行加減乘除等操作,但是它的設(shè)計又有一個模塊復(fù)用和訪存控制,這樣設(shè)計的原因應(yīng)該是讓我們更好用吧,沒有深究過這個。

12.如何使用runtime hook一個class的某個方法,又如何hook某個instance的方法?

做到這里在電腦碼字快三十分鐘了啊,peak大大,你問的問題都好難回答啊,要分各種情況。這題也是首先要考慮 hook是否有公開頭文件的類,有的話寫一個Utility函數(shù),再使用category,沒有的話就建一個類作為新函數(shù)載體,然后先為被hook的類增加函數(shù),再替換,沒錯就是這個樣子。后面如何h如何hook某個instance的方法,應(yīng)該可以定義一個函數(shù)指針變量,hook時將要調(diào)用的地址賦給這個變量,調(diào)用時把這個變量當(dāng)作函數(shù)來用就行了。

13.談下Objective C都有哪些鎖機(jī)制,你一般用哪個?

synchronized、NSLOCK、GCD、遞歸鎖、分布鎖、同步鎖(這個是C語言的),一般用GCD,這里就不說了,真心不想碼字了,peak大大可能會問,為什么,又要把各種鎖機(jī)制對比,這我會瘋,我腦袋要死機(jī)了,重啟中…

14.聊下HTTP post的body體使用form-urlencoded和multipart/form-data的區(qū)別。

http定義了與服務(wù)器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE,剛好公司上個項(xiàng)目都用了這四種方式的請求,怎么都是踩過得坑。

form-urlencoded是默認(rèn)的mime內(nèi)容編碼類型,是通用的,但是它在傳輸比較大的二進(jìn)制或者文本數(shù)據(jù)時效率極低。

multipart/form-data是當(dāng)上傳文件或者二進(jìn)制數(shù)據(jù)和非ASCII數(shù)據(jù)使用。

15.讓你設(shè)計一種機(jī)制檢測UIViewController的內(nèi)存泄漏,你會怎么做?

這個問題沒有考慮過,都是自己寫單元測試什么的來測試,都是些基礎(chǔ)的測試,一般都是用Instrument來測試一些東西的。自己設(shè)計的話,主要還是要考慮一個VC的生命周期。

16.通過[UIImage imageNamed:]生成的對象什么時候被釋放?

應(yīng)該是到@autoreleasepool 結(jié)束的時候才釋放的,但是我都是用這imageWithContentsOfFile方法加載圖片的

17.applicationWillEnterForeground和applicationDidBecomeActive都會在哪些場景下被調(diào)用?舉例越多越好。

推送、做支付的時候,跳到人家運(yùn)用,后臺殺進(jìn)程的時候、做IM的時候、第三方授權(quán)分享登錄回調(diào)情況下等等

18.如何終止正在運(yùn)行的工作線程?

在線程中調(diào)用exit、pthread_exit、pthread_kill、pthread_cance都行吧

19.窮舉iOS下所有的本地持久化方案。

沙盒

plist文件(屬性列表)

preference(偏好設(shè)置)

NSKeyedArchiver(歸檔)

SQLite 3

CoreData

還有請補(bǔ)充...

20.如果公司強(qiáng)制996,你有什么心里話要對老板說嗎?

沒什么話,習(xí)慣了,主要想要對產(chǎn)品經(jīng)理說你的需求能不能想好在做,不要瞎搞,謝謝。

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

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

  • 我的答案 我有過不少面試和被面試的經(jīng)歷,作為面試官出這份面試題從來就不是為了難倒面試者,而是為了多角度全面的了解面...
    北辰青閱讀 6,312評論 5 59
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,555評論 19 139
  • 1.NSString如何計算字符的個數(shù)? 應(yīng)該是用countElements的函數(shù)來統(tǒng)計字符串所包含的字符個數(shù),把...
    夢夜繁星閱讀 438評論 0 2
  • 看到這個題目是一個群里的朋友發(fā)的,感謝那個兄弟,看到MrPeak大大出的題目啊 好開心,試著答,各位大大請輕噴,剛...
    NinaX閱讀 3,239評論 2 7
  • 該文章屬于<簡書 — Timhbw>原創(chuàng),轉(zhuǎn)載請注明: <簡書社區(qū) — Timhbw>http://www.jia...
    伯虔閱讀 17,191評論 3 158

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