看到一篇文章蜕便,里邊木有面試題答案卸亮,就小總結(jié)了一下。傳送門
初次編寫玩裙,如有不對之處請下方留言共同學(xué)習兼贸,拜謝了~!3越Α溶诞!
希望對大家有所幫助,對我自己有所幫助
話不多說直接正題:
1决侈、我們說的Objective-C是動態(tài)運行時語言是什么意思螺垢?
首先,這個問題涉及到兩個概念赖歌,運行時和多態(tài)枉圃。
簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別庐冯,以及調(diào)用該類別對象指定方法孽亲。
好吧,上邊是我復(fù)制的展父。我認為就是OC的動態(tài)特性返劲。主要是:動態(tài)類型(如id)玲昧,動態(tài)綁定,動態(tài)加載篮绿。之所以叫動態(tài)孵延,
就是必須運行到時(run time)才會去做一些事情。
2亲配、講一下MVC和MVVM尘应,MVP?
好吧這個就是沒吃過豬肉還沒見過豬跑嘛吼虎?我最常用的是MVC菩收。^^.
簡單來說MVC(Model View Controller)就是模型(Model)- 視圖(View)-控制器(Controller)的縮寫,
Model是用來處理數(shù)據(jù)鲸睛,View是用來展示界面娜饵,Cotroller是用來調(diào)節(jié)他們兩者之間的交互。
這個是最常用的官辈。但是View和Model之間的直接交互箱舞,就導(dǎo)致了View和Model之間的耦合性比較大。
MVP (Model View Presenter)是MVC模式的變種拳亿,使用Presenter代替了Controller晴股,而且改變了數(shù)據(jù)流向
View和Model之間不再直接進行交互,而是通過Presenter來進行的肺魁〉缦妫總體來說Presenter同時持有View和Model。
優(yōu)點:整體框架分層清晰鹅经,降低了耦合度寂呛。
缺點:需要加入Presenter來作為協(xié)調(diào)Model和View的橋梁,同時也導(dǎo)致了Presenter的臃腫瘾晃。在維護起來不方便贷痪。
MVVM(Model View View-Model ViewModel)其實是對MVP的一種改進,他將Presenter替換成ViewModel蹦误,
并通過雙向數(shù)據(jù)綁定來實現(xiàn)視圖和數(shù)據(jù)的交互劫拢。
優(yōu)點:使其數(shù)據(jù)流向更加清晰(腦補一下就是云對雨,x對風强胰,大陸對長空)舱沧。一一對應(yīng)起來。
缺點:這種架構(gòu)沒有統(tǒng)一的實現(xiàn)方式偶洋,每個人各有特色熟吏。我接觸過得各有不同。而且有一定的學(xué)習成本涡真。(不懂得人去學(xué)習也得一周左右吧分俯,不抬杠肾筐,學(xué)過之后再來回話哆料。"大牛請忽略")
3缸剪、為什么代理要用weak?代理的delegate和dataSource有什么區(qū)別东亦?block和代理的區(qū)別?
3.1 因為用weak修飾的對象引用計數(shù)不會+1.好吧杏节。說白了就是不會造成循環(huán)引用。0.0~典阵!
3.2 delegate偏重于用戶交互的回調(diào)奋渔。dataSource偏重于數(shù)據(jù)的回調(diào)。
3.3 首先共同點都是實現(xiàn)回調(diào)的方式壮啊。算了直白點說就是一個一對一嫉鲸,一個一對多。一個編寫簡單歹啼,一個實現(xiàn)繁復(fù)玄渗。
對于什么時候用block什么時候用代理簡單來說就是公共接口,方法較多狸眼,回調(diào)類型較多可以選擇用代理藤树。對于異步和簡單的回調(diào)用block好一點。
4拓萌、屬性的實質(zhì)是什么岁钓?包括哪幾個部分?屬性默認的關(guān)鍵字都有哪些微王?@dynamic關(guān)鍵字和@synthesize關(guān)鍵字是用來做什么的屡限?
好吧。這個題很low炕倘,但是很考驗人囚霸。不關(guān)心這些一般不知道
4.1 屬性的實質(zhì),包含哪些:
@property = ivar + getter + setter;
??利用class_copyPropertyList 查看類的所有屬性
??利用class_copyIvarList查看類的所有成員變量
??利用class_copyMethodList查看類的所有方法
4.2 屬性默認的關(guān)鍵字有哪些 (好吧激才,我也不知道拓型。本體底部會有傳送門)
@dynamic告訴編譯器,屬性的setter與getter方法由用戶自己實現(xiàn)。
@synthesize的語義是如果你沒有手動實現(xiàn)setter方法和getter方法瘸恼,那么編譯器會自動為你加上這兩個方法劣挫。
5、NSString為什么要用copy關(guān)鍵字东帅,如果用strong會有什么問題压固?
copy修飾的是深拷貝,改變源字符串靠闭,不影響copy的屬性內(nèi)容帐我。
strong修飾的屬性就隨著源字符串改變而改變了坎炼。
這些都是說修飾可變類型字符串。當然不可變的就隨意發(fā)揮了拦键。盡量還是用copy谣光。因為什么呢?因為如果你來回轉(zhuǎn)換呢芬为?哈哈
7萄金、如何令自己所寫的對象具有拷貝功能?
實現(xiàn)NSCoping協(xié)議。如果自定義的對象分為可變版本與不可變版本媚朦,那么就要同時實現(xiàn) NSCopying與 NSMutableCopying協(xié)議氧敢。
8、簡述kvo询张、kvc孙乖、Delegate、通知份氧,他們之間的區(qū)別唯袄?
1、代理的效率比通知要高半火。
2越妈、代理比通知更加直接。
3钮糖、kvo和通知梅掠,代理一樣,都是負責通信的店归。kvo和通知沒有返回值阎抒,而代理有返回值。
4消痛、代理是一對一且叁,通知,kvo是一對多秩伞。
9逞带、include與#import的區(qū)別?#import與@class的區(qū)別纱新?
怎么說呢展氓, include 是C預(yù)言中用來引用的關(guān)鍵字。反正我是沒用過
#import 是OC中用來代替 include的關(guān)鍵字脸爱。#import確保了同一個文件只能被導(dǎo)入一次遇汞,從而別面了使用 #include容易引起的重復(fù)導(dǎo)入問題。
@class只是告訴編譯器,后邊遇到的這名稱是類名空入,至于這個類是如何實現(xiàn)的暫時不考慮络它,用來解決線程鎖死的問題。
就相當于一個軍隊遇見了另外一個軍對歪赢,打不打不無所謂化戳,然后兩軍衣服不一樣」焯剩縱橫過去迂烁。
10看尼、nonatomic和atomic的區(qū)別递鹉?atomic是絕對的線程安全么?為什么藏斩?如果不是躏结,那應(yīng)該如何實現(xiàn)?
nonatomic和atomic用來決定編譯器生成的getter和setter操作是否為原子狰域。
atomic不是絕對的線程安全媳拴。因為什么呢,因為atomic的本意是指屬性的存取方法是線程安全的兆览,不是保證整個對象是線程安全的屈溉。
如果不是,那應(yīng)該如何實現(xiàn)抬探?傳送門
是不是很枯燥無味子巾?嗯,你被辭職了嘛小压?工作找好了嘛线梗?
11、Objective-C與C怠益、C+++之間的聯(lián)系和區(qū)別仪搔?
OC與C的區(qū)別:OC中兼容C兩者可以混合編程。OC是面向?qū)ο蟮尿呃危蓄惪具郑瑢ο蟮母拍睿珻卻木有抢呆。
C是面向過程的語言煮嫌。
OC與C++的區(qū)別:
1、繼承镀娶。OC不可以多重繼承立膛,C++卻可以
2、函數(shù)調(diào)用。OC需要通過消息傳遞機制調(diào)用函數(shù)宝泵,C++卻可以直接調(diào)用
3好啰、定型。OC是動態(tài)定型儿奶。C++是等著你去找他框往。是靜態(tài)類型。
4闯捎、接口椰弊。OC采用的是protocol協(xié)議。C++采用虛函數(shù)的形式瓤鼻。
5秉版、方法重載。OC不允許有同一個類中出現(xiàn)兩個相同的方法名茬祷。C++中允許兩個方法名相同清焕。
好吧。其實我也不知道祭犯,我百度的秸妥。 -_-!
12、UICollectionView自定義layout如何實現(xiàn)沃粗?
額粥惧。這個問題,不知道怎么說好最盅。如何自定義突雪。不就是繼承UICollectionViewFlowLayout類實現(xiàn)字節(jié)想要實現(xiàn)的東西嗎?
13檩禾、進程和線程的區(qū)別二庵?同步異步的區(qū)別尖滚?并行和并發(fā)的區(qū)別?
這個問題怎么說呢,一步一步說
進程和線程的區(qū)別:進程是資源分配和調(diào)度的一個獨立單元馁害。就相當于是公交車調(diào)度站芽死。一個進程里邊可以有多個線程霸旗,
一個進程里邊至少有一個線程圣絮,就相當于一個公交車調(diào)度站里最少有一輛公交車,也可以有多個公交車灌灾。
同步異步的區(qū)別:同步是進程之間的關(guān)系不是相互排斥臨界資源的關(guān)系搓译,而是相互依賴的關(guān)系。
異步是和同步相互對立的锋喜,同步是順序執(zhí)行些己,而異步是相互獨立的豌鸡。
并行:并行是同是發(fā)生多個并發(fā)事件,具有并發(fā)的含義段标,但并發(fā)不一定并行涯冠。
這個并行并發(fā)我也不太懂,應(yīng)該是這樣的逼庞。不對的話請自行百度蛇更。
14、線程間通信赛糟?
比如說派任,一個線程傳遞數(shù)據(jù)給另一個線程。
一個線程執(zhí)行完特定的任務(wù)后璧南,轉(zhuǎn)到另一個線程繼續(xù)執(zhí)行掌逛。
比如最常見的sd圖片加載。(腦補畫面)好了穆咐,完成颤诀。
15字旭、GCD的一些常用的函數(shù)对湃?(group,barrier遗淳,信號量拍柒,線程同步)
下邊有傳送門,我常用的就是定時器屈暗,回到主線程拆讯,開一個分線程。搞一個runLoop养叛。等等
出現(xiàn)吧种呐,皮卡丘
16、如何訪問并修改一個類的私有屬性弃甥?
1爽室、通過KVC訪問并修改。
2淆攻、通過runtime訪問并修改阔墩。
17、數(shù)據(jù)持久化的幾個方案瓶珊?
1啸箫、plist文件 2、preference 3伞芹、歸檔 4忘苛、SQLite3(fmdb) 5、CoreData
18、說一下AppDelegate的幾個方法扎唾?從后臺到前臺調(diào)用了哪些方法蜀肘?第一次啟動調(diào)用了哪些方法?從前臺到后臺調(diào)用了哪些方法稽屏?
這個問題沒什么說的扮宠,全靠自己平時積累。其實這個問題問了無非就是考驗一下你有沒有看過appDelegate而已狐榔。有沒有做過啟動頁坛增,有沒有處理過其他事件。
自行回去學(xué)習薄腻。
19收捣、NSCache優(yōu)于NSDictionary的幾點?
1庵楷、 NSCache是線程安全的罢艾。
2、當內(nèi)存不足時NSCach會自動釋放內(nèi)存尽纽。
3咐蚯、NSCache可以指定緩存的限額,當緩存超出限額自動釋放內(nèi)存
20弄贿、知不知道Designated Initializer春锋?使用它的時候有什么需要注意的問題?
這個問題可能好多人都不知道差凹,也不理解他是啥意思期奔,其實這個就是(指定初始化器)如果不懂,不知道危尿,不清楚呐萌。
而你又很想知道是撒,請讀下文谊娇。
21、實現(xiàn)description方法能取到什么效果邮绿?
布吉島渠旁。知道的請留言告知。謝謝船逮。我理解的是用NSLog輸出的時候會調(diào)用description的方法顾腊。具體能得到什么效果,自己試驗一下吧挖胃。
22杂靶、OC使用什么機制管理對象內(nèi)存梆惯?
這題應(yīng)該考的是OC的內(nèi)存管理,ARC和MRC吗垮。經(jīng)過排查我看到了說是通過retainCount來管理的垛吗。布吉島,我感覺這兩點答上來應(yīng)該不會差烁登。