iOS面试总结
1、timer的間隔周期準(zhǔn)嗎?為什么?怎樣實現(xiàn)一個精準(zhǔn)的timer??
NSTimer可以精確到50-100毫秒.?
NSTimer不是絕對準(zhǔn)確的,而且中間耗時或阻塞錯過下一個點,那么下一個點就pass過去了
2、MVC設(shè)計模式考慮三種對象:模型對象、視圖對象、和控制器對象。
模型對象代表特別的知識和專業(yè)技能,它們負(fù)責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯。
視圖對象知道如何顯示應(yīng)用程序的模型數(shù)據(jù),而且可能允許用戶對其進(jìn)行編輯。
控制器對象是應(yīng)用程序的視圖對象和模型對象之間的協(xié)調(diào)者。
?
3、#import跟#include的區(qū)別,@class呢?
?@class一般用于頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import。
?而#import比起#include的好處就是不會引起交叉編譯。
?
4、MVC模式的理解
MVC設(shè)計模式考慮三種對象:模型對象、視圖對象、和控制器對象。
模型對象代表特別的知識和專業(yè)技能,它們負(fù)責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯。
視圖對象知道如何顯示應(yīng)用程序的模型數(shù)據(jù),而且可能允許用戶對其進(jìn)行編輯。
控制器對象是應(yīng)用程序的視圖對象和模型對象之間的協(xié)調(diào)者。
?
5、線程與進(jìn)程的區(qū)別和聯(lián)系?
進(jìn)程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性。
進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。
進(jìn)程有獨立的地址空間,一個進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響,而線程只是一個進(jìn)程中的不同執(zhí)行路徑。
線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進(jìn)程死掉。
所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時,耗費資源較大,效率要差一些。
但對于一些要求同時進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
?
6、iOS多線程常見面試題 在項目什么時候選擇使用GCD,什么時候選擇NSOperation? 項目中使用NSOperation的優(yōu)點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結(jié)構(gòu)更好,子類化NSOperation的設(shè)計思路,是具有面向?qū)ο蟮膬?yōu)點(復(fù)用、封裝),使得實現(xiàn)是多線程支持,而接口簡單,建議在復(fù)雜項目中使用。 項目中使用GCD的優(yōu)點是GCD本身非常簡單、易用,對于不復(fù)雜的多線程操作,會節(jié)省代碼量,而Block參數(shù)的使用,會是代碼更為易讀,建議在簡單項目中使用。 7、block常見面試題 1 使用block和使用delegate完成委托模式有什么優(yōu)點? 使用block實現(xiàn)委托模式,其優(yōu)點是回調(diào)的block代碼塊定義在委托對象函數(shù)內(nèi)部,使代碼更為緊湊; 適配對象不再需要實現(xiàn)具體某個protocol,代碼更為簡潔。 8、What are KVO and KVC?答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標(biāo)識屬性,而不是通過調(diào)用存取方法,直接或通過實例變量訪問的機(jī)制。
很多情況下可以簡化程序代碼。apple文檔其實給了一個很好的例子。
kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
9、When we call objective c is runtime language what does it mean?
我們說的oc是動態(tài)運行時語言是什么意思?
答案:多態(tài)。 主要是將數(shù)據(jù)類型的確定由編譯時,推遲到了運行時。
這個問題其實淺涉及到兩個概念,運行時和多態(tài)。
簡單來說,運行時機(jī)制使我們直到運行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法。
多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個相同的方法-eat;
那人類屬于生物,豬也屬于生物,都繼承了life后,實現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。
也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個選擇器)。
因此也可以說,運行時機(jī)制是多態(tài)的基礎(chǔ)?~~~
?
10、Polymorphism?
關(guān)于多態(tài)性
答案:多態(tài),父類指針指向子類對象。
這個題目其實可以出到一切面向?qū)ο笳Z言中,
因此關(guān)于多態(tài),繼承和封裝基本最好都有個自我意識的理解,也并非一定要把書上資料上寫的能背出來。
最重要的是轉(zhuǎn)化成自我理解。?
?
11、What is responder chain?
說說響應(yīng)鏈
答案: 事件響應(yīng)鏈。包括點擊事件,畫面刷新事件等。在視圖棧內(nèi)從上至下,或者從下之上傳播。
可以說點事件的分發(fā),傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了
嚴(yán)重懷疑題目出到越后面就越籠統(tǒng)。
可以從責(zé)任鏈模式,來講通過事件響應(yīng)鏈處理,其擁有的擴(kuò)展性
?
12、Difference between frame and bounds?
frame和bounds有什么不同?
答案:frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小。(參照點是父親的坐標(biāo)系統(tǒng))
bounds指的是:該view在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點是本身坐標(biāo)系統(tǒng))
?
13、常見的object-c的數(shù)據(jù)類型有那些, 和C的基本數(shù)據(jù)類型有什么區(qū)別?如:NSInteger和int
object-c的數(shù)據(jù)類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,創(chuàng)建后便是對象,而C語言的基本數(shù)據(jù)類型int,只是一定字節(jié)的內(nèi)存空間,用于存放數(shù)值;NSInteger是基本數(shù)據(jù)類型,并不是NSNumber的子類,當(dāng)然也不是NSObject的子類。NSInteger是基本數(shù)據(jù)類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區(qū)別在于,NSInteger會根據(jù)系統(tǒng)是32位還是64位來決定是本身是int還是Long。?
?
14、Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時執(zhí)行代碼、方法又是什么?
線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用GCD的dispatch、使用子類化的NSOperation,然后將其加入NSOperationQueue;在主線程執(zhí)行代碼,方法是performSelectorOnMainThread,如果想延時執(zhí)行代碼可以用performSelector:onThread:withObject:?afterDelay: 或者使用GCD的函數(shù):dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2秒后異步執(zhí)行這里的代碼...
});
?
15、weak和assign的區(qū)別
1.weak:
(1).在ARC中,在有可能出現(xiàn)循環(huán)引用的時候,往往要通過讓其中一端使用weak來解決,比如:delegate代理屬性。
(2).如果自身已經(jīng)對它進(jìn)行一次強引用,沒有必要再強引用一次時也會使用weak。比如:自定義IBOutlet控件屬性一般也使用weak,當(dāng)然也可以使用strong。
2.assign:
用于基礎(chǔ)數(shù)據(jù)類型(例如NSInteger等)和C數(shù)據(jù)類型(int,?float,?double,?char)等,另外還有id類型。
不同點:
(1).weak,表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)。為這種屬性設(shè)置新值時,設(shè)置方法既不保留新值,也不釋放舊值。
(2).assign也可以修飾對象,但是用assign修飾的對象在釋放后,指針的地址還是存在的,也就是說指針并沒有被置為nil,會造成眾所周知的野指針異常。然而,assign修飾的基礎(chǔ)數(shù)據(jù)類型(例如NSInteger等)和C數(shù)據(jù)類型(int,?float,?double,?char)等一般分配在??臻g上,??臻g的內(nèi)存會由系統(tǒng)自動處理,當(dāng)分配的??臻g的內(nèi)存沒有被指針指向時就會被銷毀,所以不會造成野指針異常。
(3).weak比 assign多了一個功能就是當(dāng)屬性所指向的對象消失的時候(也就是內(nèi)存引用計數(shù)為0)會自動賦值為 nil,這樣再向 weak修飾的屬性發(fā)送消息就不會導(dǎo)致野指針操作crash。
?
16、__weak和__block的區(qū)別?
__weak?本身是可以避免循環(huán)引用的問題的,但是其會導(dǎo)致外部對象釋放了之后,block 內(nèi)部也訪問不到這個對象的問題,我們可以通過在 block 內(nèi)部聲明一個?__strong?的變量來指向 weakObj,使外部對象既能在 block 內(nèi)部保持住,又能避免循環(huán)引用的問題。
__block?本身無法避免循環(huán)引用的問題,但是我們可以通過在 block 內(nèi)部手動把 blockObj 賦值為 nil 的方式來避免循環(huán)引用的問題。另外一點就是?__block?修飾的變量在 block 內(nèi)外都是唯一的,要注意這個特性可能帶來的隱患。
但是__block有一點:這只是限制在ARC環(huán)境下。在非arc下,__block是可以避免引用循環(huán)的
?
17、NSString、NSArray、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字
copy的特性,copy是先release舊值,然后對之前的內(nèi)容copy一份,創(chuàng)建一份新的內(nèi)存空間,然后把指針指向新的內(nèi)存空間。
?
17、Category剖析
- Category的方法沒有“完全替換掉”原來類已經(jīng)有的方法,也就是說如果Category和原來類都有methodA,那么category附加完成之后,類的方法列表里會有兩個methodA
- Category的方法被放到了新方法列表的前面,而原來類的方法被放到了新方法列表的后面,這也就是我們平常所說的Category的方法會“覆蓋”掉原來類的同名方法,這是因為運行時在查找方法的時候是順著方法列表的順序查找的,它只要一找到對應(yīng)名字的方法,就會罷休,殊不知后面可能還有一樣名字的方法。
17.1、Category和Extension的區(qū)別
1、Extension在編譯期決議,它就是類的一部分,在編譯期和頭文件里的@interface以及實現(xiàn)文件里的@implement一起形成一個完整的類,它伴隨類的產(chǎn)生而產(chǎn)生,亦隨之一起消亡。Extension一般用來隱藏類的私有信息,你必須有一個類才能為這個類添加Extension,所以你無法為系統(tǒng)的類比如NSString添加Extension。
2、Category則完全不一樣,它是在運行期決議的。
3、Extension可以添加屬性、成員變量,而Category一般不可以。
總之,就Category和Extension的區(qū)別來看,Extension可以添加實例變量,而Category是無法添加實例變量的。因為Category在運行期,對象的內(nèi)存布局已經(jīng)確定,如果添加實例變量就會破壞類的內(nèi)部布局,這對編譯型語言來說是災(zāi)難性的。
?
18、Category和Extension的區(qū)別
1、
轉(zhuǎn)載于:https://www.cnblogs.com/needly/p/5037738.html
總結(jié)
- 上一篇: Linux基础-查看文件与目录
- 下一篇: spring源码分析的书到了