3月面試真題
本套真題是筆者的一位朋友去小蘇蘇面試分享的,答案由筆者及其朋友總結(jié),如有問題請(qǐng)及時(shí)糾正。
1.內(nèi)存管理
內(nèi)存管理:是對(duì)內(nèi)存資源進(jìn)行優(yōu)化。內(nèi)存管理三種方式:ARC(自動(dòng)內(nèi)存管理)、MRC(手動(dòng)內(nèi)存管理)、內(nèi)存池。
(1)、MRC(MannulReference Counting)手動(dòng)引用計(jì)數(shù) ,iOS 5.0之前采用的內(nèi)存管理機(jī)制,需要程序員手動(dòng)的創(chuàng)建對(duì)象申請(qǐng)內(nèi)存,然后再手動(dòng)的釋放。
MRC管理內(nèi)存的原則:誰創(chuàng)建,誰釋放,誰引用,誰管理。
在使用MRC時(shí),當(dāng)創(chuàng)建或引用一個(gè)對(duì)象的時(shí)候,需要向她發(fā)送alloc、copy、retain消息,當(dāng)釋放該對(duì)象時(shí)需要發(fā)送release消息,當(dāng)對(duì)象引用計(jì)數(shù)為0時(shí),系統(tǒng)將釋放該對(duì)象。
(2)、ARC(Automatic Reference Counting)自動(dòng)引用計(jì)數(shù)。iOS 5.0之后采用的內(nèi)存管理機(jī)制。在代碼中自動(dòng)加入了retain/release,由編譯器自動(dòng)管理計(jì)數(shù)+1和釋放。
在使用ARC時(shí),需要設(shè)置正確的property屬性(strong、weak、copy關(guān)鍵字),不然可能出現(xiàn)內(nèi)存泄露。
(3)、內(nèi)存池:autorelease是在創(chuàng)建對(duì)象的時(shí)候?qū)懙?,表示加入自?dòng)釋放池,當(dāng)釋放池銷毀時(shí),才調(diào)用引用計(jì)數(shù)-1。
2.哪些類和UIView有繼承關(guān)系(直接或間接的父類、子類關(guān)系)

3.OC的消息機(jī)制
參考消息機(jī)制
4.優(yōu)秀的設(shè)計(jì)原則
高內(nèi)聚、低耦合
5.OC或swift的冒泡算法
NSMutableArray *numbers = [NSMutableArray arrayWithObjects:@"17",@"28",@"36",@"15",@"39", nil];
NSLog(@"排序前%@",numbers);
for (int i = 0; i < 5 - 1; i++) {
//比較的躺數(shù)
for (int j = 0; j < 5 - 1 - i; j++) {
//比較的次數(shù)
if ([numbers[j] intValue] > [numbers[j + 1] intValue]) {
//這里為升序排序
int temp = [numbers[j] intValue];
numbers[j] = numbers[j + 1];
//OC中的數(shù)組只能存儲(chǔ)對(duì)象,所以這里轉(zhuǎn)換成string對(duì)象
numbers[j + 1] = [NSString stringWithFormat:@"%d",temp];
}
}
}
NSLog(@"排序后%@",numbers);
6.線程問題

7.為什么代理要使用關(guān)鍵字weak,代理里面的delegate和dataSource有什么區(qū)別
(1)防止循環(huán)引用,weak會(huì)在對(duì)象引用計(jì)數(shù)為0的時(shí)候自動(dòng)釋放。具體參考iOS 為什么要用weak修飾代理。
(2)datasource協(xié)議里面東西是跟內(nèi)容有關(guān)的,主要是cell的構(gòu)造函數(shù),各種屬性。
delegate協(xié)議里面的方法主要是操作相關(guān)的,移動(dòng)編輯之類的,你都寫上要用什么方法自己去翻就是了 。
8.什么時(shí)候會(huì)報(bào)unrecognized selector錯(cuò)誤?iOS用那些機(jī)制來避免走到這一步
(1)、
對(duì)象未實(shí)現(xiàn)該方法。
對(duì)象已經(jīng)被釋放。
(2)、
- 使用[id respondsToSelector:]進(jìn)行判斷。
- Method resolution:objc運(yùn)行時(shí)會(huì)調(diào)用+resolveInstanceMethod:或者 +resolveClassMethod:,讓你有機(jī)會(huì)提供一個(gè)函數(shù)實(shí)現(xiàn)。如果你添加了函數(shù),那運(yùn)行時(shí)系統(tǒng)就會(huì)重新啟動(dòng)一次消息發(fā)送的過程,否則 ,運(yùn)行時(shí)就會(huì)移到下一步,消息轉(zhuǎn)發(fā)(Message Forwarding)。返回Nil和self,去調(diào)用第三步methodSignatureForSelector和forwarInvocation;返回receiver,如果receiver有響應(yīng)就直接處理,如果沒有就去對(duì)應(yīng)的對(duì)象內(nèi)去調(diào)用第三步;調(diào)用子類的函數(shù),子類沒有進(jìn)行這幾個(gè)方法的重載,在父類處理時(shí)返回子類,會(huì)死循環(huán)。
- Fast forwarding:如果目標(biāo)對(duì)象實(shí)現(xiàn)了-forwardingTargetForSelector:,Runtime 這時(shí)就會(huì)調(diào)用這個(gè)方法,給你把這個(gè)消息轉(zhuǎn)發(fā)給其他對(duì)象的機(jī)會(huì)。 只要這個(gè)方法返回的不是nil和self,整個(gè)消息發(fā)送的過程就會(huì)被重啟,當(dāng)然發(fā)送的對(duì)象會(huì)變成你返回的那個(gè)對(duì)象。否則,就會(huì)繼續(xù)Normal Fowarding。 這里叫Fast,只是為了區(qū)別下一步的轉(zhuǎn)發(fā)機(jī)制。因?yàn)檫@一步不會(huì)創(chuàng)建任何新的對(duì)象,但下一步轉(zhuǎn)發(fā)會(huì)創(chuàng)建一個(gè)NSInvocation對(duì)象,所以相對(duì)更快點(diǎn)。
- Normal forwarding:這一步是Runtime最后一次給你挽救的機(jī)會(huì)。首先它會(huì)發(fā)送-methodSignatureForSelector:消息獲得函數(shù)的參數(shù)和返回值類型。如果-methodSignatureForSelector:返回nil,Runtime則會(huì)發(fā)出-doesNotRecognizeSelector:消息,程序這時(shí)也就掛掉了。如果返回了一個(gè)函數(shù)簽名,Runtime就會(huì)創(chuàng)建一個(gè)NSInvocation對(duì)象并發(fā)送-forwardInvocation:消息給目標(biāo)對(duì)象。
9.介紹下分類,說下能用分類做什么?內(nèi)部是如何實(shí)現(xiàn)的?分類中如果實(shí)現(xiàn)了類的相同方法會(huì)出現(xiàn)什么情況?
category:是為已經(jīng)存在的類添加方法。
功能:
a)可以把不同的功能組織到不同的category里
b)可以有多個(gè)開發(fā)者共同完成一個(gè)類
c)可以按需加載想要的category等等。
d)減少文件數(shù)量。
內(nèi)部實(shí)現(xiàn):
category的方法沒有完全替換掉原來類已經(jīng)有的方法,而是和原有方法共存,并排在了原有方法的前面。編譯時(shí)是按照順序查找的,因此會(huì)執(zhí)行category的方法。
10.寫一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)
#define MIN(a,b) ((a)>(b)?(b):(a))