序言
目前形勢,參加到iOS隊(duì)伍的人是越來越多村缸,甚至已經(jīng)到供過于求了祠肥。今年,找過工作人可能會更深刻地體會到今年的就業(yè)形勢不容樂觀梯皿,加之仇箱,培訓(xùn)機(jī)構(gòu)一火車地向用人單位輸送iOS開發(fā)人員县恕,打破了生態(tài)圈的動(dòng)態(tài)平衡。矯情一下剂桥,言歸正傳忠烛,我奉獻(xiàn)一下,為iOS應(yīng)聘者梳理一下面試題渊额,希望能助一臂之力!
OC的理解與特性
OC作為一門面向?qū)ο蟮恼Z言况木,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承旬迹、多態(tài)。它既具有靜態(tài)語言的特性(如C++)求类,又有動(dòng)態(tài)語言的效率(動(dòng)態(tài)綁定奔垦、動(dòng)態(tài)加載等)∈總體來講椿猎,OC確實(shí)是一門不錯(cuò)的編程語言,
Objective-C具有相當(dāng)多的動(dòng)態(tài)特性寿弱,表現(xiàn)為三方面:動(dòng)態(tài)類型(Dynamic typing)犯眠、動(dòng)態(tài)綁定(Dynamic binding)和動(dòng)態(tài)加載(Dynamic loading)。動(dòng)態(tài)——必須到運(yùn)行時(shí)(run time)才會做的一些事情症革。
動(dòng)態(tài)類型:即運(yùn)行時(shí)再決定對象的類型筐咧,這種動(dòng)態(tài)特性在日常的應(yīng)用中非常常見,簡單來說就是id類型噪矛。事實(shí)上量蕊,由于靜態(tài)類型的固定性和可預(yù)知性,從而使用的更加廣泛艇挨。靜態(tài)類型是強(qiáng)類型残炮,而動(dòng)態(tài)類型屬于弱類型,運(yùn)行時(shí)決定接受者缩滨。
動(dòng)態(tài)綁定:基于動(dòng)態(tài)類型势就,在某個(gè)實(shí)例對象被確定后,其類型便被確定了脉漏,該對象對應(yīng)的屬性和響應(yīng)消息也被完全確定苞冯。
動(dòng)態(tài)加載:根據(jù)需求加載所需要的資源,最基本就是不同機(jī)型的適配鸠删,例如抱完,在Retina設(shè)備上加載@2x的圖片,而在老一些的普通蘋設(shè)備上加載原圖刃泡,讓程序在運(yùn)行時(shí)添加代碼模塊以及其他資源巧娱,用戶可根據(jù)需要加載一些可執(zhí)行代碼和資源碉怔,而不是在啟動(dòng)時(shí)就加載所有組件,可執(zhí)行代碼可以含有和程序運(yùn)行時(shí)整合的新類禁添。
簡述內(nèi)存管理基本原則
之前:OC內(nèi)存管理遵循“誰創(chuàng)建撮胧,誰釋放,誰引用老翘,誰管理”的機(jī)制芹啥,當(dāng)創(chuàng)建或引用一個(gè)對象的時(shí)候,需要向她發(fā)送alloc铺峭、copy墓怀、retain消息,當(dāng)釋放該對象時(shí)需要發(fā)送release消息卫键,當(dāng)對象引用計(jì)數(shù)為0時(shí)傀履,系統(tǒng)將釋放該對象,這是OC的手動(dòng)管理機(jī)制(MRC)莉炉。
目前:iOS 5.0之后引用自動(dòng)管理機(jī)制——自動(dòng)引用計(jì)數(shù)(ARC)钓账,管理機(jī)制與手動(dòng)機(jī)制一樣,只是不再需要調(diào)用retain絮宁、release梆暮、autorelease;它編譯時(shí)的特性绍昂,當(dāng)你使用ARC時(shí)啦粹,在適當(dāng)位置插入release和autorelease;它引用strong和weak關(guān)鍵字治专,strong修飾的指針變量指向?qū)ο髸r(shí)卖陵,當(dāng)指針指向新值或者指針不復(fù)存在,相關(guān)聯(lián)的對象就會自動(dòng)釋放张峰,而weak修飾的指針變量指向?qū)ο罄崮瑁?dāng)對象的擁有者指向新值或者不存在時(shí)weak修飾的指針會自動(dòng)置為nil。
如果使用alloc喘批、copy(mutableCopy)或者retian一個(gè)對象時(shí),你就有義務(wù),向它發(fā)送一條release或者autorelease消息撩荣。其他方法創(chuàng)建的對象,不需要由你來管理內(nèi)存。
向一個(gè)對象發(fā)送一條autorelease消息,這個(gè)對象并不會立即銷毀, 而是將這個(gè)對象放入了自動(dòng)釋放池,待池子釋放時(shí),它會向池中每一個(gè)對象發(fā)送 一條release消息,以此來釋放對象.
向一個(gè)對象發(fā)送release消息,并不意味著這個(gè)對象被銷毀了,而是當(dāng)這個(gè)對象的引用計(jì)數(shù)為0時(shí),系統(tǒng)才會調(diào)用dealloc方法,釋放該對象和對象本身它所擁有的實(shí)例饶深。
其他注意事項(xiàng)
如果一個(gè)對象有一個(gè)_strong類型的指針指向著餐曹,找個(gè)對象就不會被釋放。如果一個(gè)指針指向超出了它的作用域敌厘,就會被指向nil台猴。如果一個(gè)指針被指向nil,那么它原來指向的對象就被釋放了。當(dāng)一個(gè)視圖控制器被釋放時(shí)饱狂,它內(nèi)部的全局指針會被指向nil曹步。用法“:不管全局變量還是局部變量用_strong描述就行。
局部變量:出了作用域休讳,指針會被置為nil讲婚。
方法內(nèi)部創(chuàng)建對象,外部使用需要添加_autorelease;
連線的時(shí)候俊柔,用_weak描述筹麸。
代理使用unsafe_unretained就相當(dāng)于assign;
block中為了避免循環(huán)引用問題雏婶,使用_weak描述物赶;
聲明屬性時(shí),不要以new開頭留晚。如果非要以new開頭命名屬性的名字块差,需要自己定制get方法名,如
@property(getter=theString)?NSString?*?newString;
如果要使用自動(dòng)釋放池倔丈,用@autoreleasepool{}
ARC只能管理Foundation框架的變量,如果程序中把Foundation中的變量強(qiáng)制換成COre Foundation中的變量需要交換管理權(quán)状蜗;
在非ARC工程中采用ARC去編譯某些類:-fobjc-arc需五。
在ARC下的工程采用非ARC去編譯某些類:-fno-fobjc-arc。
如何理解MVC設(shè)計(jì)模式
MVC是一種架構(gòu)模式轧坎,M表示MOdel宏邮,V表示視圖View,C表示控制器Controller:
Model負(fù)責(zé)存儲缸血、定義蜜氨、操作數(shù)據(jù);
View用來展示書給用戶捎泻,和用戶進(jìn)行操作交互飒炎;
Controller是Model和View的協(xié)調(diào)者,Controller把Model中的數(shù)據(jù)拿過來給View用笆豁。Controller可以直接與Model和View進(jìn)行通信郎汪,而View不能和Controller直接通信。View與Controller通信需要利用代理協(xié)議的方式闯狱,當(dāng)有數(shù)據(jù)更新時(shí)煞赢,MOdel也要與Controller進(jìn)行通信,這個(gè)時(shí)候就要用Notification和KVO哄孤,這個(gè)方式就像一個(gè)廣播一樣照筑,MOdel發(fā)信號,Controller設(shè)置監(jiān)聽接受信號,當(dāng)有數(shù)據(jù)更新時(shí)就發(fā)信號給Controller凝危,Model和View不能直接進(jìn)行通信波俄,這樣會違背MVC設(shè)計(jì)模式。
如何理解MVVM設(shè)計(jì)模式
ViewModel層媒抠,就是View和Model層的粘合劑弟断,他是一個(gè)放置用戶輸入驗(yàn)證邏輯,視圖顯示邏輯趴生,發(fā)起網(wǎng)絡(luò)請求和其他各種各樣的代碼的極好的地方阀趴。說白了,就是把原來ViewController層的業(yè)務(wù)邏輯和頁面邏輯等剝離出來放到ViewModel層苍匆。
View層刘急,就是ViewController層,他的任務(wù)就是從ViewModel層獲取數(shù)據(jù)浸踩,然后顯示叔汁。
如需了解更多,請查看這篇文章
Objective-C 中是否支持垃圾回收機(jī)制检碗?
OC是支持垃圾回收機(jī)制的(Garbage collection簡稱GC),但是apple的移動(dòng)終端中,是不支持GC的,Mac桌面系統(tǒng)開發(fā)中是支持的.
移動(dòng)終端開發(fā)是支持ARC(Automatic Reference Counting的簡稱),ARC是在IOS5之后推出的新技術(shù),它與GC的機(jī)制是不同的据块。我們在編寫代碼時(shí), 不需要向?qū)ο蟀l(fā)送release或者autorelease方法,也不可以調(diào)用delloc方法,編譯器會在合適的位置自動(dòng)給用戶生成release消息(autorelease),ARC 的特點(diǎn)是自動(dòng)引用技術(shù)簡化了內(nèi)存管理的難度.
協(xié)議的基本概念和協(xié)議中方法默認(rèn)為什么類型
OC中的協(xié)議是一個(gè)方法列表,且多少有點(diǎn)相關(guān)。它的特點(diǎn)是可以被任何類使用(實(shí)現(xiàn)),但它并不是類(這里我們需要注意),自身不會實(shí)現(xiàn)這樣方法, 而是又其他人來實(shí)現(xiàn)協(xié)議經(jīng)常用來實(shí)現(xiàn)委托對象(委托設(shè)計(jì)模式)折剃。如果一個(gè)類采用了一個(gè)協(xié)議,那么它必須實(shí)現(xiàn)協(xié)議中必須需要實(shí)現(xiàn)的方法,在協(xié)議中的方法默認(rèn)是必須實(shí)現(xiàn)(@required),添加關(guān)鍵字@optional,表明一旦采用該協(xié)議,這些“可選”的方法是可以選擇不實(shí)現(xiàn)的另假。
簡述類目category優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
不需要通過增加子類而增加現(xiàn)有類的行為(方法),且類目中的方法與原始類方法基本沒有區(qū)別;
通過類目可以將龐大一個(gè)類的方法進(jìn)行劃分,從而便于代碼的日后的維護(hù)、更新以及提高代碼的閱讀性;
缺點(diǎn):
無法向類目添加實(shí)例變量,如果需要添加實(shí)例變量,只能通過定義子類的方式;
類目中的方法與原始類以及父類方法相比具有更高優(yōu)先級,如果覆蓋父類的方法,可能導(dǎo)致super消息的斷裂怕犁。因此,最好不要覆蓋原始類中的方法边篮。
類別的作用
給系統(tǒng)原有類添加方法,不能擴(kuò)展屬性奏甫。如果類別中方法的名字跟系統(tǒng)的方法名一樣戈轿,在調(diào)用的時(shí)候類別中的方法優(yōu)先級更高;
分散類的實(shí)現(xiàn):如:
+?(NSIndexPath*)indexPathForRow:(NSInteger)rowinSection:(NSInteger)section
原本屬于NSIndexPath的方法阵子,但因?yàn)檫@個(gè)方法經(jīng)常使用的表的時(shí)候調(diào)用头镊、跟表的關(guān)系特別密切取胎,因此把這個(gè)方法一類別的形式涩澡、聲明在UITableView.h中咕娄。
聲明私有方法,某一個(gè)方法只實(shí)現(xiàn)奈梳,不聲明杈湾,相當(dāng)于私有方法。
類別不能聲明變量攘须,類別不可以直接添加屬性漆撞。property描述setter方法,就不會報(bào)錯(cuò)。
循環(huán)引用的產(chǎn)生原因浮驳,以及解決方法
產(chǎn)生原因:如下圖所示悍汛,對象A和對象B相互引用了對方作為自己的成員變量,只有自己銷毀的時(shí)候才能將成員變量的引用計(jì)數(shù)減1至会。對象A的銷毀依賴于對象B的銷毀离咐,同時(shí)對象B銷毀也依賴與對象A的銷毀,從而形成循環(huán)引用奉件,此時(shí)宵蛀,即使外界沒有任何指針訪問它,它也無法釋放县貌。
循環(huán)引用示例圖
多個(gè)對象間依然會存在循環(huán)引用問題术陶,形成一個(gè)環(huán),在編程中煤痕,形成的環(huán)越大越不容易察覺梧宫,如下圖所示:
多個(gè)對象引用示例圖
解決方法:
事先知道存在循環(huán)引用的地方,在合理的位置主動(dòng)斷開一個(gè)引用摆碉,是對象回收塘匣;
使用弱引用的方法。