1.Difference between shallow copy and deep copy?
淺復(fù)制和深復(fù)制的區(qū)別茫多?
答案:淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔樆蛙睿粡?fù)制引用對(duì)象本身子库。
深層復(fù)制:復(fù)制引用對(duì)象本身团甲。
意思就是說(shuō)我有個(gè)A對(duì)象镐确,復(fù)制一份后得到A_copy對(duì)象后瓜晤,對(duì)于淺復(fù)制來(lái)說(shuō)锥余,A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的只不過(guò)是是一個(gè)指針痢掠,對(duì)象本身資源
還是只有一份驱犹,那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想足画。深復(fù)制就好理解了,內(nèi)存中存在了
兩份獨(dú)立對(duì)象本身雄驹。
用網(wǎng)上一哥們通俗的話將就是:
淺復(fù)制好比你和你的影子,你完蛋淹辞,你的影子也完蛋
深復(fù)制好比你和你的克隆人荠医,你完蛋,你的克隆人還活著。
2.What is advantage of categories? What is difference between implementing a category and inheritance?
類別的作用彬向?繼承和類別在實(shí)現(xiàn)中有何區(qū)別兼贡?
答案:category 可以在不獲悉,不改變?cè)瓉?lái)代碼的情況下往里面添加新的方法娃胆,只能添加遍希,不能刪除修改。
并且如果類別和原來(lái)類中的方法產(chǎn)生名稱沖突里烦,則類別將覆蓋原來(lái)的方法凿蒜,因?yàn)轭悇e具有更高的優(yōu)先級(jí)。
類別主要有3個(gè)作用:
(1)將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中胁黑。
(2)創(chuàng)建對(duì)私有方法的前向引用废封。
(3)向?qū)ο筇砑臃钦絽f(xié)議。
繼承可以增加丧蘸,修改或者刪除方法漂洋,并且可以增加屬性。
面試復(fù)習(xí)筆記:
這份資料我從春招開(kāi)始力喷,就會(huì)將各博客刽漂、論壇。網(wǎng)站上等優(yōu)質(zhì)的iOS開(kāi)發(fā)中高級(jí)面試題收集起來(lái)弟孟,然后全網(wǎng)尋找最優(yōu)的解答方案贝咙。每一道面試題都是百分百的大廠面經(jīng)真題+最優(yōu)解答。包知識(shí)脈絡(luò) + 諸多細(xì)節(jié)拂募。
節(jié)省大家在網(wǎng)上搜索資料的時(shí)間來(lái)學(xué)習(xí)庭猩,也可以分享給身邊好友一起學(xué)習(xí)。
——[加入圈子: 891 488 181]就可以免費(fèi)領(lǐng)取
3.Difference between categories and extensions?
類別和類擴(kuò)展的區(qū)別陈症。
答案:category和extensions的不同在于 后者可以添加屬性眯娱。另外后者添加的方法是必須要實(shí)現(xiàn)的。
extensions可以認(rèn)為是一個(gè)私有的Category爬凑。
4.Difference between protocol in objective c and interfaces in java?
oc中的協(xié)議和java中的接口概念有何不同?
答案:OC中的代理有2層含義试伙,官方定義為 formal和informal protocol嘁信。前者和Java接口一樣。
informal protocol中的方法屬于設(shè)計(jì)模式考慮范疇疏叨,不是必須實(shí)現(xiàn)的潘靖,但是如果有實(shí)現(xiàn),就會(huì)改變類的屬性蚤蔓。
其實(shí)關(guān)于正式協(xié)議卦溢,類別和非正式協(xié)議我很早前學(xué)習(xí)的時(shí)候大致看過(guò),也寫(xiě)在了學(xué)習(xí)教程里
“非正式協(xié)議概念其實(shí)就是類別的另一種表達(dá)方式“這里有一些你可能希望實(shí)現(xiàn)的方法,你可以使用他們更好的完成工作”单寂。
這個(gè)意思是贬芥,這些是可選的。比如我門(mén)要一個(gè)更好的方法宣决,我們就會(huì)申明一個(gè)這樣的類別去實(shí)現(xiàn)蘸劈。然后你在后期可以直接使用這些更好的方法。
這么看尊沸,總覺(jué)得類別這玩意兒有點(diǎn)像協(xié)議的可選協(xié)議威沫。"
現(xiàn)在來(lái)看,其實(shí)protocal已經(jīng)開(kāi)始對(duì)兩者都統(tǒng)一和規(guī)范起來(lái)操作洼专,因?yàn)橘Y料中說(shuō)“非正式協(xié)議使用interface修飾“棒掠,
現(xiàn)在我們看到協(xié)議中兩個(gè)修飾詞:“必須實(shí)現(xiàn)(@requied)”和“可選實(shí)現(xiàn)(@optional)”。
5.What are KVO and KVC?
答案:kvc:鍵 - 值編碼是一種間接訪問(wèn)對(duì)象的屬性使用字符串來(lái)標(biāo)識(shí)屬性屁商,而不是通過(guò)調(diào)用存取方法烟很,直接或通過(guò)實(shí)例變量訪問(wèn)的機(jī)制。
很多情況下可以簡(jiǎn)化程序代碼棒假。apple文檔其實(shí)給了一個(gè)很好的例子溯职。
kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法帽哑,極大的簡(jiǎn)化了代碼谜酒。
具體用看到嗯哼用到過(guò)的一個(gè)地方是對(duì)于按鈕點(diǎn)擊變化狀態(tài)的的監(jiān)控。
比如我自定義的一個(gè)button
[cpp]
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];
pragma mark KVO
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"highlighted"] ) {
[self setNeedsDisplay];
}
}
對(duì)于系統(tǒng)是根據(jù)keypath去取的到相應(yīng)的值發(fā)生改變妻枕,理論上來(lái)說(shuō)是和kvc機(jī)制的道理是一樣的僻族。
對(duì)于kvc機(jī)制如何通過(guò)key尋找到value:
“當(dāng)通過(guò)KVC調(diào)用對(duì)象時(shí),比如:[self valueForKey:@”someKey”]時(shí)屡谐,程序會(huì)自動(dòng)試圖通過(guò)幾種不同的方式解析這個(gè)調(diào)用述么。首先查找對(duì)象是否帶有 someKey 這個(gè)方法,如果沒(méi)找到愕掏,會(huì)繼續(xù)查找對(duì)象是否帶有someKey這個(gè)實(shí)例變量(iVar)度秘,如果還沒(méi)有找到,程序會(huì)繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個(gè)方法饵撑。如果這個(gè)方法還是沒(méi)有被實(shí)現(xiàn)的話剑梳,程序會(huì)拋出一個(gè)NSUndefinedKeyException 異常錯(cuò)誤。
(cocoachina.com注:Key-Value Coding查找方法的時(shí)候滑潘,不僅僅會(huì)查找someKey這個(gè)方法垢乙,還會(huì)查找getsomeKey這個(gè)方法,前面加一個(gè)get语卤,或者_(dá)someKey以及 _getsomeKey這幾種形式追逮。同時(shí)酪刀,查找實(shí)例變量的時(shí)候也會(huì)不僅僅查找someKey這個(gè)變量,也會(huì)查找_someKey這個(gè)變量是否存在钮孵。)
設(shè)計(jì)valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey方法從對(duì)象中請(qǐng)求值時(shí)骂倘,對(duì)象能夠在錯(cuò)誤發(fā)生前,有最后的機(jī)會(huì)響應(yīng)這個(gè)請(qǐng)求油猫。這樣做有很多好處稠茂,下面的兩個(gè)例子說(shuō)明了這樣做的好處∏檠“
來(lái)至cocoa睬关,這個(gè)說(shuō)法應(yīng)該挺有道理。
因?yàn)槲覀冎纀utton卻是存在一個(gè)highlighted實(shí)例變量.因此為何上面我們只是add一個(gè)相關(guān)的keypath就行了毡证,
可以按照kvc查找的邏輯理解电爹,就說(shuō)的過(guò)去了。
6.What is purpose of delegates?
代理的作用料睛?
答案:代理的目的是改變或傳遞控制鏈丐箩。允許一個(gè)類在某些特定時(shí)刻通知到其他類,而不需要獲取到那些類的指針恤煞∈嚎保可以減少框架復(fù)雜度。
另外一點(diǎn)居扒,代理可以理解為java中的回調(diào)監(jiān)聽(tīng)機(jī)制的一種類似概漱。
7.What are mutable and immutable types in Objective C?
oc中可修改和不可以修改類型。
答案:可修改不可修改的集合類喜喂。這個(gè)我個(gè)人簡(jiǎn)單理解就是可動(dòng)態(tài)添加修改和不可動(dòng)態(tài)添加修改一樣瓤摧。
比如NSArray和NSMutableArray。前者在初始化后的內(nèi)存控件就是固定不可變的玉吁,后者可以添加等照弥,可以動(dòng)態(tài)申請(qǐng)新的內(nèi)存空間。
8.When we call objective c is runtime language what does it mean?
我們說(shuō)的oc是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言是什么意思进副?
答案:多態(tài)这揣。 主要是將數(shù)據(jù)類型的確定由編譯時(shí),推遲到了運(yùn)行時(shí)影斑。
這個(gè)問(wèn)題其實(shí)淺涉及到兩個(gè)概念给赞,運(yùn)行時(shí)和多態(tài)。
簡(jiǎn)單來(lái)說(shuō)鸥昏,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對(duì)象的類別,以及調(diào)用該類別對(duì)象指定方法姐帚。
多態(tài):不同對(duì)象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)吏垮。意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;
那人類屬于生物,豬也屬于生物,都繼承了life后膳汪,實(shí)現(xiàn)各自的eat唯蝶,但是調(diào)用是我們只需調(diào)用各自的eat方法。
也就是不同的對(duì)象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)遗嗽。
因此也可以說(shuō)粘我,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)?~~~
9.what is difference between NSNotification and protocol?
通知和協(xié)議的不同之處痹换?
答案:協(xié)議有控制鏈(has-a)的關(guān)系征字,通知沒(méi)有。
首先我一開(kāi)始也不太明白娇豫,什么叫控制鏈(專業(yè)術(shù)語(yǔ)了~)匙姜。但是簡(jiǎn)單分析下通知和代理的行為模式,我們大致可以有自己的理解
簡(jiǎn)單來(lái)說(shuō)冯痢,通知的話氮昧,它可以一對(duì)多,一條消息可以發(fā)送給多個(gè)消息接受者浦楣。
代理按我們的理解袖肥,到不是直接說(shuō)不能一對(duì)多,比如我們知道的明星經(jīng)濟(jì)代理人振劳,很多時(shí)候一個(gè)經(jīng)濟(jì)人負(fù)責(zé)好幾個(gè)明星的事務(wù)椎组。
只是對(duì)于不同明星間,代理的事物對(duì)象都是不一樣的澎迎,一一對(duì)應(yīng)庐杨,不可能說(shuō)明天要處理A明星要一個(gè)發(fā)布會(huì),代理人發(fā)出處理發(fā)布會(huì)的消息后夹供,別稱B的
發(fā)布會(huì)了灵份。但是通知就不一樣,他只關(guān)心發(fā)出通知哮洽,而不關(guān)心多少接收到感興趣要處理填渠。
因此控制鏈(has-a從英語(yǔ)單詞大致可以看出,單一擁有和可控制的對(duì)應(yīng)關(guān)系鸟辅。
10.What is push notification?
什么是推送消息氛什?
答案:太簡(jiǎn)單,不作答~~~~~~~~~~
這是cocoa上的答案匪凉。
其實(shí)到不是說(shuō)太簡(jiǎn)單枪眉,只是太泛泛的一個(gè)概念的東西。就好比說(shuō)再层,什么是人贸铜。
推送通知更是一種技術(shù)堡纬。
簡(jiǎn)單點(diǎn)就是客戶端獲取資源的一種手段。
普通情況下蒿秦,都是客戶端主動(dòng)的pull烤镐。
推送則是服務(wù)器端主動(dòng)push。 測(cè)試push的實(shí)現(xiàn)可以查看該博文棍鳖。
11.Polymorphism炮叶?
關(guān)于多態(tài)性
答案:多態(tài),子類指針可以賦值給父類渡处。
這個(gè)題目其實(shí)可以出到一切面向?qū)ο笳Z(yǔ)言中镜悉,
因此關(guān)于多態(tài),繼承和封裝基本最好都有個(gè)自我意識(shí)的理解骂蓖,也并非一定要把書(shū)上資料上寫(xiě)的能背出來(lái)积瞒。
最重要的是轉(zhuǎn)化成自我理解。
12.Singleton?
對(duì)于單例的理解
答案:11登下,12題目其實(shí)出的有點(diǎn)泛泛的感覺(jué)了茫孔,可能說(shuō)是編程語(yǔ)言需要或是必備的基礎(chǔ)。
基本能用熟悉的語(yǔ)言寫(xiě)出一個(gè)單例被芳,以及可以運(yùn)用到的場(chǎng)景或是你編程中碰到過(guò)運(yùn)用的此種模式的框架類等缰贝。
進(jìn)一步點(diǎn),考慮下如何在多線程訪問(wèn)單例時(shí)的安全性畔濒。
13.What is responder chain?
說(shuō)說(shuō)響應(yīng)鏈
答案: 事件響應(yīng)鏈剩晴。包括點(diǎn)擊事件,畫(huà)面刷新事件等侵状。在視圖棧內(nèi)從上至下赞弥,或者從下之上傳播。
可以說(shuō)點(diǎn)事件的分發(fā)趣兄,傳遞以及處理绽左。具體可以去看下touch事件這塊。因?yàn)閱?wèn)的太抽象化了
嚴(yán)重懷疑題目出到越后面就越籠統(tǒng)艇潭。
可以從責(zé)任鏈模式拼窥,來(lái)講通過(guò)事件響應(yīng)鏈處理,其擁有的擴(kuò)展性
14.Difference between frame and bounds?
frame和bounds有什么不同蹋凝?
答案:frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小鲁纠。(參照點(diǎn)是父親的坐標(biāo)系統(tǒng))
bounds指的是:該view在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))
15.Difference between method and selector?
方法和選擇器有何不同鳍寂?
答案:selector是一個(gè)方法的名字改含,method是一個(gè)組合體,包含了名字和實(shí)現(xiàn).
詳情可以看apple文檔迄汛。
16.Is there any garbage collection mechanism in Objective C.?
OC的垃圾回收機(jī)制捍壤?
答案: OC2.0有Garbage collection刃唤,但是iOS平臺(tái)不提供。
一般我們了解的objective-c對(duì)于內(nèi)存管理都是手動(dòng)操作的白群,但是也有自動(dòng)釋放池。
但是差了大部分資料硬霍,貌似不要和arc機(jī)制搞混就好了帜慢。
求更多~~
17.NSOperation queue?
答案:存放NSOperation的集合類。
操作和操作隊(duì)列唯卖,基本可以看成java中的線程和線程池的概念粱玲。用于處理ios多線程開(kāi)發(fā)的問(wèn)題。
網(wǎng)上部分資料提到一點(diǎn)是拜轨,雖然是queue抽减,但是卻并不是帶有隊(duì)列的概念,放入的操作并非是按照嚴(yán)格的先進(jìn)現(xiàn)出橄碾。
這邊又有個(gè)疑點(diǎn)是卵沉,對(duì)于隊(duì)列來(lái)說(shuō),先進(jìn)先出的概念是Afunc添加進(jìn)隊(duì)列法牲,Bfunc緊跟著也進(jìn)入隊(duì)列史汗,Afunc先執(zhí)行這個(gè)是必然的,
但是Bfunc是等Afunc完全操作完以后拒垃,B才開(kāi)始啟動(dòng)并且執(zhí)行停撞,因此隊(duì)列的概念離亂上有點(diǎn)違背了多線程處理這個(gè)概念。
但是轉(zhuǎn)念一想其實(shí)可以參考銀行的取票和叫號(hào)系統(tǒng)悼瓮。
因此對(duì)于A比B先排隊(duì)取票但是B率先執(zhí)行完操作戈毒,我們亦然可以感性認(rèn)為這還是一個(gè)隊(duì)列。
但是后來(lái)看到一票關(guān)于這操作隊(duì)列話題的文章横堡,其中有一句提到
“因?yàn)閮蓚€(gè)操作提交的時(shí)間間隔很近埋市,線程池中的線程,誰(shuí)先啟動(dòng)是不定的翅萤】制#”
瞬間覺(jué)得這個(gè)queue名字有點(diǎn)忽悠人了,還不如pool~
綜合一點(diǎn)套么,我們知道他可以比較大的用處在于可以幫組多線程編程就好了培己。
18.What is lazy loading?
答案:懶漢模式,只在用到的時(shí)候才去初始化胚泌。
也可以理解成延時(shí)加載省咨。
我覺(jué)得最好也最簡(jiǎn)單的一個(gè)列子就是tableView中圖片的加載顯示了。
一個(gè)延時(shí)載玷室,避免內(nèi)存過(guò)高零蓉,一個(gè)異步加載笤受,避免線程堵塞。
19.Can we use two tableview controllers on one viewcontroller?
是否在一個(gè)視圖控制器中嵌入兩個(gè)tableview控制器敌蜂?
答案:一個(gè)視圖控制只提供了一個(gè)View視圖箩兽,理論上一個(gè)tableViewController也不能放吧,
只能說(shuō)可以嵌入一個(gè)tableview視圖章喉。當(dāng)然汗贫,題目本身也有歧義,如果不是我們定性思維認(rèn)為的UIViewController秸脱,
而是宏觀的表示視圖控制者落包,那我們倒是可以把其看成一個(gè)視圖控制者,它可以控制多個(gè)視圖控制器摊唇,比如TabbarController
那樣的感覺(jué)咐蝇。
20.Can we use one tableview with two different datasources? How you will achieve this?
一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的數(shù)據(jù)源?你會(huì)怎么處理巷查?
答案:首先我們從代碼來(lái)看有序,數(shù)據(jù)源如何關(guān)聯(lián)上的,其實(shí)是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實(shí)現(xiàn)的岛请。
因此我們并不關(guān)心如何去關(guān)聯(lián)他笔呀,他怎么關(guān)聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源髓需。
因此许师,我覺(jué)得可以設(shè)置多個(gè)數(shù)據(jù)源啊,但是有個(gè)問(wèn)題是僚匆,你這是想干嘛呢微渠?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示咧擂?
推薦??:
作為一個(gè)開(kāi)發(fā)者逞盆,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要,這是一個(gè)我的iOS交流圈:[891488181]松申,不管你是小白還是大牛歡迎入駐 云芦,分享BAT,阿里面試題、面試經(jīng)驗(yàn)贸桶,討論技術(shù)舅逸, 大家一起交流學(xué)習(xí)成長(zhǎng)!
申請(qǐng)即送:
BAT大廠面試題皇筛、獨(dú)家面試工具包,
-
資料免費(fèi)領(lǐng)取琉历,包括 數(shù)據(jù)結(jié)構(gòu)、底層進(jìn)階、圖形視覺(jué)旗笔、音視頻彪置、架構(gòu)設(shè)計(jì)、逆向安防蝇恶、RxSwift拳魁、flutter,
文章到這里就結(jié)束了撮弧,你也可以私信我及時(shí)獲取最新資料以及面試相關(guān)資料的猛。如果你有什么意見(jiàn)和建議歡迎給我留言。