1. OC語言的基本特點(diǎn)
OC語言是C語言的一個超集,只是在C的基礎(chǔ)之上加上了面向?qū)ο?oo)的特性;
OC與Java語言相同都是單繼承,這一點(diǎn)與C++語言不同(多重繼承);
OC不支持命名空間機(jī)制,取而代之的是在類名之前添加前綴,以此來區(qū)分。
2. #include與#import的區(qū)別、#import與@class的區(qū)別
(1)#include與#import的區(qū)別:#include和#import其效果相同,只是后者不會引起交叉編譯,確保頭文件只會被導(dǎo)入一次。
(2)#import與@class的區(qū)別:import會包含這個類的所有信息,包括實(shí)體變量和方法,而@class只是告訴編譯器,其后面聲明的名稱是類的名稱,至于這些類是如何定義的,暫時不用考慮,后面會再告訴你。使用#import編譯效率高,防止相互包含的編譯錯誤!
3. 簡述類目優(yōu)點(diǎn)和缺點(diǎn),如果覆蓋本類或者父類的方法,會出現(xiàn)什么問題?
(1)優(yōu)點(diǎn):不需要通過增加子類而增加現(xiàn)有類的行為(方法),且類目中的方法與原始類方法基本沒有區(qū)別
(2)缺點(diǎn):無法向類目添加實(shí)例變量。覆蓋原始類方法后,原始類的方法沒辦法調(diào)用
4. 簡述內(nèi)存管理基本原則
如果使用alloc、copy(mutableCopy)或者retain一個對象時,你就有義務(wù),向它發(fā)送一條release或者autorelease消息。其他方法創(chuàng)建的對象,不需要由你來管理內(nèi)存。
5. 什么是ARC技術(shù)?與GC是否相同?
ARC是Automatic Reference Counting的簡稱,我們稱之為自動引用計數(shù),是iOS5.0之后推出的內(nèi)存管理的新特性。本質(zhì)上還是使用引用計數(shù)來管理對象,只是我們在編寫代碼時,不需要向?qū)ο蟀l(fā)送release或者autorelease方法,也不可以調(diào)用delloc方法,編譯器會在合適的位置自動給用戶生成release消息(autorelease)。GC的全稱是garbage collection,內(nèi)存垃圾回收機(jī)制,ARC比GC性能好!
6. 內(nèi)存中的堆區(qū)和棧區(qū)的差別
棧區(qū)(stack)由編譯器自動分配釋放,存放方法(函數(shù))的參數(shù)值,局部變量的值等,堆區(qū)(heap)一般由程序員分配和釋放,程序員不釋放,則內(nèi)存溢出
7. 定義屬性時,什么時候用assign、retain、copy、nonatomic
(1)assign:普通賦值,一般常用于基本數(shù)據(jù)類型,常見委托設(shè)計模式,以此來防止循環(huán)引用。
(2)retain:保留計數(shù),獲得對象的所有權(quán)。引用計數(shù)在原有基礎(chǔ)上面加1。
(3)用來復(fù)制對象,一般字符串使用copy,F(xiàn)oundation 中的不可變對象使用copy效果相當(dāng)于retain,只是引用計數(shù)+1。
(4)nonatomic,非原子性訪問,不加同步,多線程并發(fā)訪問會提高性能
8. strong 與weak , _unsafe_unretained與weak的區(qū)別
(1)strong叫強(qiáng)引用,weak 叫弱引用,在ARC中,使用strong告訴編譯器幫助我們自動插入retain,weak是普通賦值相當(dāng)于手動管理內(nèi)存的assign,
(2)_unsafe_unretained與weak功能一致,區(qū)別在于當(dāng)指向的對象銷毀后,weak會將變量置為nil,防止調(diào)用野指針。
9. ARC存在內(nèi)存泄露嗎?
ARC中如果內(nèi)存管理不當(dāng)?shù)脑?,同樣會存在?nèi)存泄露,例如:ARC中也會循環(huán)引用導(dǎo)致內(nèi)存泄露,OC對象與CoreFoundation類之間橋接時,管理不當(dāng)也會產(chǎn)生內(nèi)存泄露
10. 當(dāng)我們釋放對象時,為什么需要調(diào)用[super dealloc]方法?
因為子類是繼承自父類,那么子類中有一些實(shí)例變量(對象),是繼承自父類的,因此,我們需要調(diào)用父類方法,將父類所擁有的實(shí)例進(jìn)行釋放。
11. iOS開發(fā)中數(shù)據(jù)持久性,有哪幾種?
plist文件寫入,對象歸檔,sqlite3數(shù)據(jù)庫、coredata
12. 什么是KVC 和 KVO ?以及它們之間的關(guān)系是什么?
(1)KVC(鍵值編碼)是一種間接訪問對象實(shí)例變量的機(jī)制,該機(jī)制可以不通過存取方法就可以訪問對象的實(shí)例變量
(2)KVO(鍵值觀察)是一種能使得對象獲取到其他對象屬性變化的通知機(jī)制。
(3)實(shí)現(xiàn)KVO鍵值觀察模式,被觀察的對象必須使用KVC鍵值編碼來修改它的實(shí)例變量,這樣才能被觀察者觀察到。因此,KVC是KVO的基礎(chǔ)或者說KVO的實(shí)現(xiàn)是建立在KVC的基礎(chǔ)之上的。
13. 簡述常見的設(shè)計模式
單例設(shè)計、代理設(shè)計、觀察者(通知)、工廠方法、模板方法
14. 內(nèi)存管理 在dealloc 方法中 用realease方法好還是用self.xxx=nil 好?
使用self.xxx = nil 更好,因為先調(diào)用了realease方法,而且還將變量設(shè)置為nil,這樣就更安全的釋放對象,防止野指針調(diào)用
15. 線程與進(jìn)程的區(qū)別和聯(lián)系?
一般的應(yīng)用程序是單個進(jìn)程,也有多進(jìn)程(谷歌瀏覽器),進(jìn)程是個靜態(tài)的容器,里面容納了很多個線程,線程是一系列方法的線性執(zhí)行路徑。
16. OC語言的優(yōu)缺點(diǎn):
(1)優(yōu)點(diǎn):類目、動態(tài)識別、支持C語言、OC與C++可以混編
(2)缺點(diǎn):不支持命名空間、不支持運(yùn)算符重載、不支持多重繼承
17. 代理delegate與通知Notification、block的使用區(qū)別
delegate與block一般是用于兩個對象1對1之間的通信交互,delegate需要定義協(xié)議方法,代理對象實(shí)現(xiàn)協(xié)議方法,并且需要建立代理關(guān)系才可以實(shí)現(xiàn)通信。block更加簡潔,不需要定義繁瑣的協(xié)議方法,但是如果通信事件比較多的話,建議使用delegate。Notification主要用于1對多情況下通信,而且通信對象之間不需要建立聯(lián)系!但是使用通知代碼可讀性差。
18. 控制器ViewController的loadView,viewDidLoad,viewDidUnload分別是在什么時候調(diào)用的?
(1)loadView調(diào)用:當(dāng)控制器的根視圖view為空,且此view被訪問時則調(diào)用
(2)loadView調(diào)用之后調(diào)用viewDidLoad
(3)iOS6.0之前,當(dāng)內(nèi)存警告時,先卸載視圖,再調(diào)用ViewDidUnload來釋放內(nèi)存
19. @synthesize 和 @dynamic 的區(qū)別
(1)@synthesize 是系統(tǒng)自動生成getter 和setter屬性聲明
(2)@dynamic 的意思是告訴編譯器,屬性的獲取與賦值方法由用戶自己實(shí)現(xiàn),不自動生成。
20. 事件響應(yīng)者鏈的概念
響應(yīng)者鏈表示一系列的響應(yīng)者對象。事件被交由第一響應(yīng)者對象處理,如果第一響應(yīng)者不處理,事件將沿著響應(yīng)者鏈向上傳遞,交給下一個響應(yīng)者(next responder)。一般來說,第一響應(yīng)者是個視圖對象或者其子類對象,當(dāng)其被觸摸后事件被交由它處理,如果它不處理,事件就會被傳遞給它的視圖控制器對象(如果存在),然后是它的父視圖(superview)對象(如果存在),以此類推,直到頂層視圖。接下來會沿著頂層視圖(top view)到窗口(UIWindow對象)再到程序(UIApplication對象)。如果整個過程都沒有響應(yīng)這個事件,該事件就會被丟棄。一般情況下,在響應(yīng)者鏈中只要由對象處理事件,事件就停止傳遞。但有時候可以在視圖的響應(yīng)方法中根據(jù)一些條件判斷來決定是否需要繼續(xù)傳遞事件。
21. C語言中static變量和static函數(shù)有什么作用?
(1)表示變量是靜態(tài)存儲變量,表示變量存放在靜態(tài)存儲區(qū)
(2)加在函數(shù)前面的時候表示該函數(shù)是內(nèi)部連接,只在本文件中有效,別的文件中不能應(yīng)用該函數(shù)。