前幾天看到一篇文章非科班iOS開(kāi)發(fā)者的面試總結(jié)锡搜,記錄了一個(gè)非科班iOS程序員面試時(shí)候的困惑,從側(cè)面反映出當(dāng)前行業(yè)的現(xiàn)狀瞧掺。
iOS行業(yè)在經(jīng)歷了過(guò)去幾年的爆發(fā)期后耕餐,現(xiàn)在到了一個(gè)相對(duì)冷靜的時(shí)期,一個(gè)良幣驅(qū)逐劣幣辟狈、去偽存真的階段肠缔。只有持續(xù)的專注和付出,才能夠在激烈的競(jìng)爭(zhēng)中脫穎而出上陕,成為強(qiáng)者桩砰。正如狄更斯所言,“這是一個(gè)最壞的時(shí)代释簿,也是最好的時(shí)代” 亚隅。
對(duì)于這些面試題,不要死記硬背庶溶,應(yīng)該舉一反三煮纵,深刻理解實(shí)現(xiàn)機(jī)制(這也是科班和非科班的區(qū)別之一)。面試題答案只是參考偏螺,如有錯(cuò)誤請(qǐng)指正行疏。
如果讓你實(shí)現(xiàn)屬性的weak,如何實(shí)現(xiàn)的套像?
runtime
對(duì)注冊(cè)的類會(huì)進(jìn)行布局酿联,對(duì)于weak
修飾的對(duì)象會(huì)放入一個(gè)hash
表中。用weak指向的對(duì)象內(nèi)存地址作為key,當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì)dealloc
贞让,假如weak
指向的對(duì)象內(nèi)存地址是a周崭,那么就會(huì)以a為鍵在這個(gè)weak表中搜索,找到所有以a為鍵的weak
對(duì)象喳张,從而設(shè)置為nil
续镇。
如果讓你來(lái)實(shí)現(xiàn)屬性的atomic,如何實(shí)現(xiàn)销部?
- (void)setCurrentImage:(UIImage *)currentImage
{
@synchronized(self) {
if (_currentImage != currentImage) {
[_currentImage release];
_currentImage = [currentImage retain];
// do something
}
}
}
- (UIImage *)currentImage
{
@synchronized(self) {
return _currentImage;
}
}
KVO為什么要?jiǎng)?chuàng)建一個(gè)子類來(lái)實(shí)現(xiàn)摸航?
Runtime動(dòng)態(tài)生成一個(gè)NSKVONotifying_Class子類,可以動(dòng)態(tài)地添加willChangeValueForKey
和didChangeValueForKey
觀察所有屬性的變化
類結(jié)構(gòu)體的組成舅桩,isa指針指向了什么酱虎?(這里應(yīng)該將元類和根元類也說(shuō)一下)
isa:是一個(gè)Class 類型的指針. 每個(gè)實(shí)例對(duì)象有個(gè)isa的指針,他指向?qū)ο蟮念悾鳦lass里也有個(gè)isa的指針, 指向meteClass(元類)江咳。元類保存了類方法的列表逢净。當(dāng)類方法被調(diào)用時(shí),先會(huì)從本身查找類方法的實(shí)現(xiàn)歼指,如果沒(méi)有爹土,元類會(huì)向他父類查找該方法。同時(shí)注意的是:元類(meteClass)也是類踩身,它也是對(duì)象胀茵。元類也有isa指針,它的isa指針最終指向的是一個(gè)根元類(root meteClass).根元類的isa指針指向本身,這樣形成了一個(gè)封閉的內(nèi)循環(huán)挟阻。
RunLoop有幾種事件源琼娘?有幾種模式?
Runloop(消息循環(huán))的目的:
1. 基本作用:保持程序的持續(xù)運(yùn)行,保證程序不退出
2. 處理App中的各種事件(比如觸摸事件,定時(shí)器事件,Selector事件)
3. 節(jié)省CPU資源,提高程序性能:該做事時(shí)做事,該休息是休息
- 事件源:輸入源和定時(shí)源
- 模式:有4種模式 第一種就是默認(rèn)模式: 也就是一般的方法調(diào)用使用的模式附鸽。第二種就是跟蹤模式: 用于scrollview追蹤觸摸滑動(dòng), 使其不受其他模式的影響, 可以共存脱拼。 第三種就是當(dāng)程序啟動(dòng)時(shí)第一次開(kāi)啟的運(yùn)行循環(huán)模式。第四種的話一般開(kāi)發(fā)中沒(méi)聽(tīng)到過(guò)坷备。沒(méi)有去研究過(guò)熄浓。其實(shí)還有一種占位模式。不過(guò)沒(méi)什么太大用處省撑。
方法列表的數(shù)據(jù)結(jié)構(gòu)是什么赌蔑?
struct objc_method_list
{
struct objc_method_list* method_next; /* 這個(gè)變量用來(lái)鏈接另一個(gè)單獨(dú)的方法鏈表 */
int method_count; /* 結(jié)構(gòu)中定義的方法數(shù)量 */
struct objc_method method_list[1]; /* 可變長(zhǎng)度的結(jié)構(gòu) */
};
分類是如何實(shí)現(xiàn)的?它為什么會(huì)覆蓋掉原來(lái)的方法竟秫?
因?yàn)榉诸惙椒尤腩愔羞@一操作是在運(yùn)行期系統(tǒng)加載分類時(shí)完成的娃惯,運(yùn)行期系統(tǒng)會(huì)把分類中所實(shí)現(xiàn)的每一個(gè)方法都加入類的方法列表中
- category的實(shí)例方法、協(xié)議以及屬性添加到類上
- category的類方法和協(xié)議添加到類的metaclass上
category的方法被放到了新方法列表的前面肥败,而原來(lái)類的方法被放到了新方法列表的后面趾浅,所以category的方法會(huì)“覆蓋”掉原來(lái)類的同名方法愕提。