1. struct和class的區(qū)別
swift中移稳,class是引用類型走诞,struct是值類型摔笤。值類型在傳遞和賦值時(shí)將進(jìn)行復(fù)制够滑,而引用類型則只會(huì)使用引用對(duì)象的一個(gè)"指向"。所以他們兩者之間的區(qū)別就是兩個(gè)類型的區(qū)別吕世。
class有這幾個(gè)功能struct沒有的:
class可以繼承彰触,這樣子類可以使用父類的特性和方法
類型轉(zhuǎn)換可以在runtime的時(shí)候檢查和解釋一個(gè)實(shí)例的類型
可以用deinit來釋放資源
一個(gè)類可以被多次引用
struct也有這樣幾個(gè)優(yōu)勢(shì):
結(jié)構(gòu)較小,適用于復(fù)制操作命辖,相比于一個(gè)class的實(shí)例被多次引用更加安全况毅。
無須擔(dān)心內(nèi)存memory leak或者多線程沖突問題
順便提一下,array在swift中是用struct實(shí)現(xiàn)的尔艇。Apple重寫過一次array尔许,然后復(fù)制就是深度拷貝了。猜測(cè)復(fù)制是類似參照那樣终娃,通過棧上指向堆上位置的指針來實(shí)現(xiàn)的味廊。而對(duì)于它的復(fù)制操作,也是在相對(duì)空間較為寬裕的堆上來完成的棠耕,所以性能上還是不錯(cuò)的余佛。
下面引用貓神OneV的博客:
var arr = [0,0,0]var newArr = arrarr[0] =1//Check arr and newArrarr//[1, 0, 0]newArr// before beta3:[1, 0, 0], after beta3:[0, 0, 0]
所以可以猜測(cè)其實(shí)在背后 Array和 Dictionary的行為并不是像其他 struct 那樣簡單的在棧上分配,而是類似參照那樣昧辽,通過棧上指向堆上位置的指針來實(shí)現(xiàn)的衙熔。而對(duì)于它的復(fù)制操作,也是在相對(duì)空間較為寬裕的堆上來完成的搅荞。當(dāng)然红氯,現(xiàn)在還無法(或者說很難)拿到最后的匯編碼,所以這只是一個(gè)猜測(cè)而已咕痛。
補(bǔ)充:
C語言中痢甘,struct與的class的區(qū)別:
struct只是作為一種復(fù)雜數(shù)據(jù)類型定義,不能用于面向?qū)ο缶幊獭?/p>
C++中茉贡,struct和class的區(qū)別:
對(duì)于成員訪問權(quán)限以及繼承方式塞栅,class中默認(rèn)的是private的,而struct中則是public的腔丧。class還可以用于表示模板類型放椰,struct則不行。
2. 介紹一下觀察者模式
觀察者模式(Observer Pattern):定義對(duì)象間的一種一對(duì)多依賴關(guān)系愉粤,使得每當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí)砾医,其相關(guān)依賴對(duì)象皆得到通知并被自動(dòng)更新。
在IOS中典型的推模型實(shí)現(xiàn)方式為NSNotificationCenter和KVO衣厘。
NSNotificationCenter
NSNotificationCenter
觀察者Observer如蚜,通過NSNotificationCenter的addObserver:selector:name:object接口來注冊(cè)對(duì)某一類型通知感興趣压恒。在注冊(cè)時(shí)候一定要注意,NSNotificationCenter不會(huì)對(duì)觀察者進(jìn)行引用計(jì)數(shù)+1的操作错邦,我們?cè)诔绦蛑嗅尫庞^察者的時(shí)候探赫,一定要去報(bào)從center中將其注銷了。
通知中心NSNotificationCenter撬呢,通知的樞紐伦吠。
被觀察的對(duì)象,通過postNotificationName:object:userInfo:發(fā)送某一類型通知倾芝,廣播改變讨勤。
通知對(duì)象NSNotification,當(dāng)有通知來的時(shí)候晨另,Center會(huì)調(diào)用觀察者注冊(cè)的接口來廣播通知潭千,同時(shí)傳遞存儲(chǔ)著更改內(nèi)容的NSNotification對(duì)象。
KVO
KVO的全稱是Key-Value Observer借尿,即鍵值觀察刨晴。是一種沒有中心樞紐的觀察者模式的實(shí)現(xiàn)方式。一個(gè)主題對(duì)象管理所有依賴于它的觀察者對(duì)象路翻,并且在自身狀態(tài)發(fā)生改變的時(shí)候主動(dòng)通知觀察者對(duì)象狈癞。
注冊(cè)觀察者
[object addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:]。
更改主題對(duì)象屬性的值茂契,即觸發(fā)發(fā)送更改的通知蝶桶。
在制定的回調(diào)函數(shù)中,處理收到的更改通知掉冶。
注銷觀察者 [object removeObserver:self forKeyPath:property]真竖。
3.在一個(gè)HTTPS連接的網(wǎng)站里,輸入賬號(hào)密碼點(diǎn)擊登錄后厌小,到服務(wù)器返回這個(gè)請(qǐng)求前恢共,中間經(jīng)歷了什么
這個(gè)非常得深非常得廣,我來大概說一下璧亚。
HTTPS加密流程
客戶端會(huì)打包一個(gè)請(qǐng)求讨韭,包括url,端口啊癣蟋,你的賬號(hào)密碼等等透硝。賬號(hào)密碼登陸應(yīng)該用的是Post方式,所以相關(guān)的用戶信息會(huì)被加載到body里面疯搅。這個(gè)請(qǐng)求應(yīng)該包含三個(gè)方面:網(wǎng)絡(luò)地址濒生,協(xié)議,資源路徑秉撇。注意甜攀,這里是HTTPS,就是HTTP + SSL / TLS琐馆,在HTTP上又加了一層處理加密信息的模塊(相當(dāng)于是個(gè)鎖)规阀。
一般會(huì)先請(qǐng)求DNS服務(wù)器。DNS服務(wù)器負(fù)責(zé)將你的網(wǎng)絡(luò)地址解析成IP地址瘦麸,這個(gè)IP地址對(duì)應(yīng)網(wǎng)上一臺(tái)機(jī)器谁撼。這其中可能發(fā)生Hosts Hijack和ISP failure的問題。
協(xié)議是獲取資源的方式HTTP滋饲,F(xiàn)TP厉碟,UDP,不同協(xié)議有不同的格式屠缭,有些是process-to-process的箍鼓,有些是host-to-host的。
客戶端會(huì)和服務(wù)器的端口之間建立一個(gè)socket連接呵曹,socket一般都是以file descriptor的方式解析請(qǐng)求款咖。
服務(wù)器端接收到請(qǐng)求。服務(wù)器端會(huì)有一套數(shù)字證書(相當(dāng)于是個(gè)鑰匙)奄喂,這個(gè)證書會(huì)先返回給客戶端铐殃。客戶端會(huì)解析證書跨新,相當(dāng)于用鑰匙(證書)把鎖(內(nèi)容)鎖上(生成私匙)富腊,接著再傳送加密信息。
服務(wù)器端接收到加密信息(私匙)之后域帐,會(huì)進(jìn)行解密赘被,并把要返回的數(shù)據(jù)進(jìn)行對(duì)稱加密返回到客戶端。假如路徑不對(duì)俯树,會(huì)出現(xiàn)404的錯(cuò)誤帘腹。
一般訪問服務(wù)器之前可能會(huì)訪問一下proxy。這玩意是個(gè)代理许饿,有時(shí)候當(dāng)防火墻用阳欲,有時(shí)候當(dāng)cache使。如果后臺(tái)是reverse-proxy結(jié)構(gòu)陋率,那么實(shí)際上有多個(gè)web服務(wù)器藏在proxy之后按需處理請(qǐng)求球化,而你訪問的永遠(yuǎn)是proxy,這樣可以解決過載問題瓦糟。
有時(shí)候訪問完web服務(wù)器后還要訪問一下file服務(wù)器筒愚,主要是請(qǐng)求數(shù)據(jù)庫里的一些信息。
服務(wù)器將相應(yīng)打包菩浙,直接或通過proxy(大多數(shù)時(shí)候)返回給客戶端巢掺【淞妫客戶端會(huì)用剛剛生成的私匙進(jìn)行解密,將內(nèi)容顯示在瀏覽器上陆淀。
HTTPS加密過程詳解請(qǐng)去https原理:證書傳遞考余、驗(yàn)證和數(shù)據(jù)加密、解密過程解析
4.在一個(gè)app中間有一個(gè)button轧苫,在你手觸摸屏幕點(diǎn)擊后楚堤,到這個(gè)button收到點(diǎn)擊事件,中間發(fā)生了什么
響應(yīng)鏈大概有以下幾個(gè)步驟
設(shè)備將touch到的UITouch和UIEvent對(duì)象打包, 放到當(dāng)前活動(dòng)的Application的事件隊(duì)列中
單例的UIApplication會(huì)從事件隊(duì)列中取出觸摸事件并傳遞給單例UIWindow
UIWindow使用hitTest:withEvent:方法查找touch操作的所在的視圖view
RunLoop這邊我大概講一下
主線程的RunLoop被喚醒
通知Observer含懊,處理Timer和Source 0
Springboard接受touch event之后轉(zhuǎn)給App進(jìn)程
RunLoop處理Source 1身冬,Source1 就會(huì)觸發(fā)回調(diào),并調(diào)用_UIApplicationHandleEventQueue() 進(jìn)行應(yīng)用內(nèi)部的分發(fā)岔乔。
RunLoop處理完畢進(jìn)入睡眠酥筝,此前會(huì)釋放舊的autorelease pool并新建一個(gè)autorelease pool
深挖請(qǐng)去深入理解RunLoop
UIResponder是UIView的父類,UIView是UIControl的父類雏门。
聲明一下樱哼,第3題依然有很大缺陷,不過因?yàn)樯钔诘牡胤教嘟伺洌疚牟豢赡芡耆骖櫧练荒軖伌u引玉。另外文章的目的是以面試題為引進(jìn)行學(xué)習(xí)呼胚,所以寫得有點(diǎn)多茄唐,可能與面試技巧和時(shí)間有沖突。
4道過濾菜鳥的iOS面試題
字?jǐn)?shù)660 閱讀5644 評(píng)論34 喜歡67
網(wǎng)上已經(jīng)有很多針對(duì)各種知識(shí)點(diǎn)的面試題蝇更,面試時(shí)有些人未必真正理解也能通過背題看上去很懂沪编。我自己總結(jié)了4道面試題,好快速的判斷這個(gè)人是否是一個(gè)合格的工程師年扩,歡迎大家點(diǎn)評(píng)蚁廓。
1.struct和class的區(qū)別
在面試之前你覺得所有的計(jì)算機(jī)專業(yè)的學(xué)生都應(yīng)該能答的上來,事實(shí)是我面的人里有超過三分一沒有答上來厨幻。
有時(shí)我還會(huì)順便問下swfit里的array是什么類型相嵌,在大量復(fù)制時(shí)會(huì)不會(huì)有性能問題。
2.介紹一下觀察者模式
也許有些人已經(jīng)覺得設(shè)計(jì)模式有些過時(shí)况脆,沒有整本讀過饭宾。就算如此iOS里常用的幾個(gè)設(shè)計(jì)模式我覺得總要了解吧。
這里如果說NSNotificationCenter怎么使用的就直接pass格了。
這個(gè)回答應(yīng)該包括三個(gè)部分:首先這個(gè)設(shè)計(jì)模式為了解決什么問題看铆,其次通過什么方案來解決,最后才是當(dāng)前體系下的具體實(shí)現(xiàn)方案盛末。
3.在一個(gè)https連接的網(wǎng)站里弹惦,輸入賬號(hào)密碼點(diǎn)擊登錄后否淤,到服務(wù)器返回這個(gè)請(qǐng)求前,中間經(jīng)歷了什么
這題是在其他看到的棠隐,本來題目是登錄gmail的時(shí)候叹括,但是國內(nèi)也許有些人不知道Google很早就全站https了,所以這里特別指出是https的連接宵荒。
這里面可以談的東西就很多了,TCP/IP下有非常多的協(xié)議净嘀。不需要什么都能說的清楚报咳,但是對(duì)于整個(gè)網(wǎng)絡(luò)連接模型的理解可以看出基本功。
4.在一個(gè)app中間有一個(gè)button挖藏,在你手觸摸屏幕點(diǎn)擊后暑刃,到這個(gè)button收到點(diǎn)擊事件,中間發(fā)生了什么
runloop和響應(yīng)鏈需要說的清楚膜眠。
有時(shí)還會(huì)順便問問UIResponder岩臣、UIControl、UIView的關(guān)系宵膨。
這4個(gè)問題只是為了一上來可以快速篩選掉不合適的程序員架谎,畢竟有的人只需要幾分鐘就知道他不合適了,好節(jié)省時(shí)間辟躏。
中午吃飯我和一個(gè)資深的同事說這些題目谷扣,我說,一個(gè)15k+的程序員我覺得一定能答的上這四題捎琐。他說你也太樂觀了会涎,按現(xiàn)在這行情他覺得恐怕要20k的程序員才能答的上來。