這幾天不斷地面試迂曲,每個(gè)面試官問(wèn)的問(wèn)題各不相同,問(wèn)的天花亂墜寥袭,把我弄得暈頭亂想路捧,所以把面試經(jīng)驗(yàn)整理一下,方便自己閱讀和復(fù)習(xí)传黄。
實(shí)際上還是自己的基礎(chǔ)不過(guò)關(guān)杰扫,只是知道寫一味地寫,并不知道其中的內(nèi)涵膘掰,希望各位以此為鑒章姓。
1、C語(yǔ)言和Object-C之間的區(qū)別识埋?
C語(yǔ)言是面向過(guò)程
Object-C語(yǔ)言是面向?qū)ο蟮?/p>
2啤覆、面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別以及優(yōu)缺點(diǎn)?
面向過(guò)程就是分析出解決問(wèn)題所需要的步驟惭聂,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了相恃。
例如五子棋耕腾,面向過(guò)程的設(shè)計(jì)思路就是首先分析問(wèn)題的步驟:1见剩、開始游戲,2扫俺、黑子先走苍苞,3、繪制畫面狼纬,4羹呵、判斷輸贏,5疗琉、輪到白子冈欢,6、繪制畫面盈简,7凑耻、判斷輸贏,8柠贤、返回步驟2香浩,9、輸出最后結(jié)果臼勉。把上面每個(gè)步驟用分別的函數(shù)來(lái)實(shí)現(xiàn)邻吭,問(wèn)題就解決了。
而面向?qū)ο?/a>的設(shè)計(jì)則是從另外的思路來(lái)解決問(wèn)題坚俗。整個(gè)五子棋可以分為 1镜盯、黑白雙方,這兩方的行為是一模一樣的猖败,2速缆、棋盤系統(tǒng),負(fù)責(zé)繪制畫面恩闻,3艺糜、規(guī)則系統(tǒng),負(fù)責(zé)判定諸如犯規(guī)幢尚、輸贏等破停。第一類對(duì)象(玩家對(duì)象)負(fù)責(zé)接受用戶輸入,并告知第二類對(duì)象(棋盤對(duì)象)棋子布局的變化尉剩,棋盤對(duì)象接收到了棋子的i變化就要負(fù)責(zé)在屏幕上面顯示出這種變化真慢,同時(shí)利用第三類對(duì)象(規(guī)則系統(tǒng))來(lái)對(duì)棋局進(jìn)行判定。
可以明顯地看出理茎,面向?qū)ο?/a>是以功能來(lái)劃分問(wèn)題黑界,而不是步驟管嬉。同樣是繪制棋局,這樣的行為在面向過(guò)程的設(shè)計(jì)中分散在了總多步驟中朗鸠,很可能出現(xiàn)不同的繪制版本蚯撩,因?yàn)橥ǔTO(shè)計(jì)人員會(huì)考慮到實(shí)際情況進(jìn)行各種各樣的簡(jiǎn)化。而面向?qū)ο蟮脑O(shè)計(jì)中烛占,繪圖只可能在棋盤對(duì)象中出現(xiàn)胎挎,從而保證了繪圖的統(tǒng)一。
功能上的統(tǒng)一保證了面向?qū)ο笤O(shè)計(jì)的可擴(kuò)展性忆家。比如我要加入悔棋的功能犹菇,如果要改動(dòng)面向過(guò)程的設(shè)計(jì),那么從輸入到判斷到顯示這一連串的步驟都要改動(dòng)弦赖,甚至步驟之間的循序都要進(jìn)行大規(guī)模調(diào)整项栏。如果是面向?qū)ο蟮脑挘挥酶膭?dòng)棋盤對(duì)象就行了蹬竖,棋盤系統(tǒng)保存了黑白雙方的棋譜沼沈,簡(jiǎn)單回溯就可以了,而顯示和規(guī)則判斷則不用顧及币厕,同時(shí)整個(gè)對(duì)對(duì)象功能的調(diào)用順序都沒(méi)有變化列另,改動(dòng)只是局部的。
再比如我要把這個(gè)五子棋游戲改為圍棋游戲旦装,如果你是面向過(guò)程設(shè)計(jì)页衙,那么五子棋的規(guī)則就分布在了你的程序的每一個(gè)角落,要改動(dòng)還不如重寫阴绢。但是如果你當(dāng)初就是面向?qū)ο蟮脑O(shè)計(jì)店乐,那么你只用改動(dòng)規(guī)則對(duì)象就可以了,五子棋和圍棋的區(qū)別不就是規(guī)則嗎呻袭?(當(dāng)然棋盤大小好像也不一樣眨八,但是你會(huì)覺(jué)得這是一個(gè)難題嗎?直接在棋盤對(duì)象中進(jìn)行一番小改動(dòng)就可以了左电。)而下棋的大致步驟從面向?qū)ο蟮慕嵌葋?lái)看沒(méi)有任何變化廉侧。
當(dāng)然,要達(dá)到改動(dòng)只是局部的需要設(shè)計(jì)的人有足夠的經(jīng)驗(yàn)篓足,使用對(duì)象不能保證你的程序就是面向?qū)ο蠖翁埽鯇W(xué)者或者很蹩腳的程序員很可能以面向?qū)ο笾摱忻嫦蜻^(guò)程之實(shí),這樣設(shè)計(jì)出來(lái)的所謂面向?qū)ο蟮某绦蚝茈y有良好的可移植性和可擴(kuò)展性栈拖。
3连舍、StoreBoard、XIB涩哟、純代碼三者之間的優(yōu)缺點(diǎn)索赏?
一诗鸭、手寫代碼UI
1、優(yōu)勢(shì)
√適合大型項(xiàng)目大規(guī)模使用参滴,利于版本管理、追蹤改動(dòng)以及代碼合并
√最好的代碼重用性
2锻弓、遺憾
√慢砾赔,開發(fā)周期長(zhǎng),維護(hù)代碼復(fù)雜
√自動(dòng)布局AutoLayout困難
二青灼、xib文件組織viewController或者view
1暴心、優(yōu)勢(shì)
√開發(fā)速度快
√在版本管理上和純代碼的差異并不是很大,易讀易維護(hù)
2杂拨、遺憾
√ ?xib中的設(shè)置往往并非最終設(shè)置专普,UI設(shè)計(jì)會(huì)被代碼所覆蓋
(如果選擇xib,那么要盡量將xib的工作和代碼的工作隔離開來(lái):能夠使用xib完成的內(nèi)容就統(tǒng)一使用xib來(lái)做弹沽,而不要說(shuō)三個(gè)Label其中兩個(gè)在xib設(shè)置了字體而另一個(gè)卻在代碼中完成檀夹。盡量?jī)H保持必要的、較少的IBOutlet和IBAction會(huì)是一個(gè)好方法策橘。)
三炸渡、storyBoard
1、優(yōu)勢(shì)
√可以看到每個(gè)ViewController的布局樣式丽已,也可以明確地知道各個(gè)ViewController之間的轉(zhuǎn)換關(guān)系
√代碼量少蚌堵,開發(fā)周期短
√關(guān)鍵是已經(jīng)成為新建項(xiàng)目時(shí)候的默認(rèn)配置,代表著蘋果以后的方向和重心
2沛婴、遺憾
√很難多人協(xié)作
√ ?ViewController的重用和自定義的view的處理
以上答案是某位大神簡(jiǎn)單的介紹吼畏,我也說(shuō)說(shuō)自己的看法:
純代碼適合項(xiàng)目規(guī)模大邏輯較為復(fù)雜的頁(yè)面,可以封裝嘁灯,重構(gòu)泻蚊,復(fù)用等特點(diǎn),利于我們管理也可以版本控制旁仿,例如實(shí)現(xiàn)動(dòng)畫藕夫,復(fù)雜的邏輯頁(yè)面的處理必須的用代碼來(lái)實(shí)現(xiàn),用xib或者storeboard無(wú)法實(shí)現(xiàn)枯冈,還的用代碼來(lái)實(shí)現(xiàn)毅贮,還的托各種的線,是代碼多尘奏,復(fù)用底滩褥,不利于管理等。
純代碼 的缺點(diǎn):開發(fā)周期長(zhǎng)炫加,布局困難瑰煎,不過(guò)現(xiàn)在有masonry自動(dòng)布局和蘋果自帶的AutoLayout使我們開發(fā)起來(lái)簡(jiǎn)單方便的多了铺然。
4、你知道哪些設(shè)計(jì)模式酒甸?他們的優(yōu)缺點(diǎn)和區(qū)別?
設(shè)計(jì)模式:MVC魄健,代理,單例插勤、委托沽瘦、通知、KVO农尖、KVC等
MVC:
01.Model
Model代表了描述業(yè)務(wù)路邏輯析恋,業(yè)務(wù)模型、數(shù)據(jù)操作盛卡、數(shù)據(jù)模型的一系列類的集合助隧。這層也定義了數(shù)據(jù)修改和操作的業(yè)務(wù)規(guī)則。
02.View
View代表了UI組件滑沧,像CSS并村,JQuery,html等嚎货。他只負(fù)責(zé)展示從controller接收到的數(shù)據(jù)橘霎。也就是把model轉(zhuǎn)化成UI。
03.Controller
Controll負(fù)責(zé)處理流入的請(qǐng)求殖属。它通過(guò)View來(lái)接受用戶的輸入姐叁,之后利用Model來(lái)處理用戶的數(shù)據(jù),最后把結(jié)果返回給View洗显。Controll就是View和Model之間的一個(gè)協(xié)調(diào)者外潜。
代理:
為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。在某些情況下挠唆,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象处窥,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。