現(xiàn)在進(jìn)入本篇的正題。本篇的面試題是我認(rèn)為比較好的iOS開(kāi)發(fā)基礎(chǔ)知識(shí)點(diǎn)薇正,希望大家看過(guò)這后在理解的基礎(chǔ)上掌握而不是死記硬背片酝。死記硬背很快也會(huì)忘記的。
1 iOS基礎(chǔ)
1.1 父類實(shí)現(xiàn)深拷貝時(shí)挖腰,子類如何實(shí)現(xiàn)深度拷貝钠怯。父類沒(méi)有實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝曙聂。
- 1 深拷貝和淺拷貝的區(qū)別:淺拷貝是指針的拷貝晦炊,對(duì)一個(gè)對(duì)象的淺拷貝,相當(dāng)于對(duì)一個(gè)指針的復(fù)制宁脊,即兩個(gè)指針同時(shí)指向一個(gè)內(nèi)存地址,對(duì)象銷毀后兩個(gè)指針應(yīng)該同時(shí)滯空断国。深拷貝是對(duì)一個(gè)對(duì)象進(jìn)行拷貝,相當(dāng)于對(duì)對(duì)象進(jìn)行復(fù)制榆苞,產(chǎn)生一個(gè)新的對(duì)象稳衬,那么就有兩個(gè)指針?lè)謩e指向兩個(gè)對(duì)象。當(dāng)一個(gè)對(duì)象改變或者被銷毀后拷貝出來(lái)的新的對(duì)象不受影響坐漏。
- 2 實(shí)現(xiàn)深拷貝需要實(shí)現(xiàn)NSCoying協(xié)議薄疚,實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone 方法碧信。當(dāng)對(duì)一個(gè)property屬性含有copy修飾符的時(shí)候,在進(jìn)行賦值操作的時(shí)候?qū)嶋H上就是調(diào)用這個(gè)方法街夭。父類實(shí)現(xiàn)深拷貝之后砰碴,子類只要重寫(xiě)copyWithZone方法,在方法內(nèi)部調(diào)用父類的copyWithZone方法板丽,之后實(shí)現(xiàn)自己的屬性的處理呈枉。父類沒(méi)有實(shí)現(xiàn)深拷貝,子類除了需要對(duì)自己的屬性進(jìn)行處理埃碱,還要對(duì)父類的屬性進(jìn)行處理猖辫。
1.2 KVO,NSNotification砚殿,delegate及block區(qū)別 - 1 KVO就是cocoa框架實(shí)現(xiàn)的觀察者模式啃憎,一般同KVC搭配使用,通過(guò)KVO可以監(jiān)測(cè)一個(gè)值的變化似炎,比如View的高度變化荧飞。是一對(duì)多的關(guān)系,一個(gè)值的變化會(huì)通知所有的觀察者名党。
- 2 NSNotification是通知,也是一對(duì)多的使用場(chǎng)景挠轴。在某些情況下传睹,KVO和NSNotification是一樣的,都是狀態(tài)變化之后告知對(duì)方岸晦。NSNotification的特點(diǎn)欧啤,就是需要被觀察者先主動(dòng)發(fā)出通知,然后觀察者注冊(cè)監(jiān)聽(tīng)后再來(lái)進(jìn)行響應(yīng)启上,比KVO多了發(fā)送通知的一步邢隧,但是其優(yōu)點(diǎn)是監(jiān)聽(tīng)不局限于屬性的變化,還可以對(duì)多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽(tīng)冈在,監(jiān)聽(tīng)范圍廣倒慧,使用也更靈活。
- 3 delegate 是代理包券,就是我不想做的事情交給別人做纫谅。比如狗需要吃飯,就通過(guò)delegate通知主人溅固,主人就會(huì)給他做飯付秕、盛飯、倒水侍郭,這些操作询吴,這些狗都不需要關(guān)心掠河,只需要調(diào)用delegate(代理人)就可以了,由其他類完成所需要的操作猛计。所以delegate是一對(duì)一關(guān)系唠摹。
- 4 block是delegate的另一種形式,是函數(shù)式編程的一種形式有滑。使用場(chǎng)景跟delegate一樣跃闹,相比delegate更靈活,而且代理的實(shí)現(xiàn)更直觀毛好。
KVO一般的使用場(chǎng)景是數(shù)據(jù)望艺,需求是數(shù)據(jù)變化,比如股票價(jià)格變化肌访,我們一般使用KVO(觀察者模式)找默。delegate一般的使用場(chǎng)景是行為,需求是需要?jiǎng)e人幫我做一件事情吼驶,比如買賣股票惩激,我們一般使用delegate。
Notification一般是進(jìn)行全局通知蟹演,比如利好消息一出风钻,通知大家去買入。delegate是強(qiáng)關(guān)聯(lián)酒请,就是委托和代理雙方互相知道骡技,你委托別人買股票你就需要知道經(jīng)紀(jì)人,經(jīng)紀(jì)人也不要知道自己的顧客羞反。Notification是弱關(guān)聯(lián)布朦,利好消息發(fā)出,你不需要知道是誰(shuí)發(fā)的也可以做出相應(yīng)的反應(yīng)昼窗,同理發(fā)消息的人也不需要知道接收的人也可以正常發(fā)出消息是趴。
1.3 將一個(gè)函數(shù)在主線程執(zhí)行的4種方法
1.4 如何讓計(jì)時(shí)器調(diào)用一個(gè)類方法
計(jì)時(shí)器只能調(diào)用實(shí)例方法,但是可以在這個(gè)實(shí)例方法里面調(diào)用靜態(tài)方法澄惊。
使用計(jì)時(shí)器需要注意唆途,計(jì)時(shí)器一定要加入RunLoop中,并且選好model才能運(yùn)行掸驱。scheduledTimerWithTimeInterval方法創(chuàng)建一個(gè)計(jì)時(shí)器并加入到RunLoop中所以可以直接使用窘哈。
如果計(jì)時(shí)器的repeats選擇YES說(shuō)明這個(gè)計(jì)時(shí)器會(huì)重復(fù)執(zhí)行,一定要在合適的時(shí)機(jī)調(diào)用計(jì)時(shí)器的invalid亭敢。不能在dealloc中調(diào)用滚婉,因?yàn)橐坏┰O(shè)置為repeats 為yes,計(jì)時(shí)器會(huì)強(qiáng)持有self帅刀,導(dǎo)致dealloc永遠(yuǎn)不會(huì)被調(diào)用让腹,這個(gè)類就永遠(yuǎn)無(wú)法被釋放远剩。比如可以在viewDidDisappear中調(diào)用,這樣當(dāng)類需要被回收的時(shí)候就可以正常進(jìn)入dealloc中了骇窍。
1.5 如何重寫(xiě)類方法 - 1 在子類中實(shí)現(xiàn)一個(gè)同基類名字一樣的靜態(tài)方法
- 2 在調(diào)用的時(shí)候不要使用類名調(diào)用瓜晤,而是使用[self class]的方式調(diào)用。原理腹纳,用類名調(diào)用是早綁定痢掠,在編譯期綁定,用[self class]是晚綁定嘲恍,在運(yùn)行時(shí)決定調(diào)用哪個(gè)方法足画。
1.6、多線程在實(shí)際現(xiàn)實(shí)中有哪些應(yīng)用佃牛?(網(wǎng)絡(luò)操作和大量圖片處理不算) - 1 通常耗時(shí)的操作都會(huì)放在子線程里處理淹辞,然后再回到主線程來(lái)顯示。下面舉幾個(gè)例子:
- 2 我們要從數(shù)據(jù)庫(kù)提取數(shù)據(jù)還要將數(shù)據(jù)分組后顯示俘侠,那么就會(huì)開(kāi)個(gè)子線程來(lái)處理象缀,處理完成后才去刷新UI顯示。
- 3 拍照后爷速,會(huì)在子線程處理圖片央星,完成后才回到主線程來(lái)顯示圖片。拍照出來(lái)的圖片太大了惫东,因此要做處理莉给。
- 4 音頻、視頻處理會(huì)在子線程來(lái)操作
- 5 文件較大時(shí)凿蒜,文件操作會(huì)在子線程中處理
- 6 做客戶端與服務(wù)端數(shù)據(jù)同步時(shí),會(huì)在后臺(tái)閑時(shí)自動(dòng)同步
**1.7readwrite胁黑,readonly废封,assign,retain丧蘸,copy漂洋,nonatomic屬性的作用 **
@property是一個(gè)屬性訪問(wèn)聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性: - 1 getter=getterName力喷,setter=setterName刽漂,設(shè)置setter與getter的方法名
- 2 readwrite,readonly,設(shè)置可供訪問(wèn)級(jí)別
- 3 assign弟孟,setter方法直接賦值贝咙,不進(jìn)行任何retain操作,為了解決原類型與環(huán)循引用問(wèn)題
- 4 retain拂募,setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值庭猩,所有實(shí)現(xiàn)都是這個(gè)順序
- 5 copy窟她,setter方法進(jìn)行Copy操作,與retain處理流程一樣蔼水,先舊值release震糖,再Copy出新的對(duì)象,retainCount為1趴腋。這是為了減少對(duì)上下文的依賴而引入的機(jī)制吊说。
copy是在你不希望a和b共享一塊內(nèi)存時(shí)會(huì)使用到。a和b各自有自己的內(nèi)存.
1.7优炬、什么是UDP和TCP的區(qū)別是什么颁井?
TCP 的全稱是傳輸控制協(xié)議,這種協(xié)議可以提供面向連接的穿剖、可靠的蚤蔓、點(diǎn)到點(diǎn)的通信。
UDP 的全稱是用戶數(shù)據(jù)包協(xié)議糊余。他可以提供非連接的不可靠的點(diǎn)懂啊多點(diǎn)的通信秀又,是osi參考模型中一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單的不可靠信息傳輸贬芥,_IETF RFC 768 是UDP 的正式規(guī)范吐辙;
選擇何種協(xié)議,看程序注重那個(gè)方面蘸劈,可靠抑或快速昏苏。
TCP/IP 建立連接的過(guò)程?
在TCP/IP 協(xié)議中威沫,TCP協(xié)議提供可靠的連接服務(wù)贤惯,采用三次握手建立連接;
第一次握手:建立連接時(shí)棒掠,客戶端發(fā)送連接請(qǐng)求到服務(wù)器孵构,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)烟很;
第二次握手:服務(wù)器收到客戶端連接請(qǐng)求颈墅,向客戶端發(fā)送允許連接應(yīng)答,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)雾袱;
第三次握手:客戶端收到服務(wù)器的允許連接應(yīng)答恤筛,向服務(wù)器發(fā)送確認(rèn),客戶端和服務(wù)器進(jìn)入通信狀態(tài)芹橡,完成三次握手毒坛。
(所謂的三次握手,就是要有三次連接信息的發(fā)送林说、接收過(guò)程粘驰。TCP連的建立需要進(jìn)行三次連接信息的發(fā)送屡谐、接收。)