注:我只是網(wǎng)絡(luò)的搬運(yùn)工。有需要的可以看一下。。
簡答題
1、Objective-C的類可以多重繼承么?可以采用多個(gè)協(xié)議么?
不可以多重繼承,可以采用多個(gè)協(xié)議。
2、#import和#include的區(qū)別是什么?#import<>?跟?#import""有什么區(qū)別?
#import能避免頭文件被重復(fù)包含的問題:
? ? 1.?一般來說,導(dǎo)入objective?c的頭文件時(shí)用#import,包含c/c++頭文件時(shí)用#include。
使用include要注意重復(fù)引用的問題:
? ? ?class?A,class?B都引用了class?C,class?D若引用class?A與class?B,就會(huì)報(bào)重復(fù)引用的錯(cuò)誤。
? ? ?2.?#import確定一個(gè)文件只能被導(dǎo)入一次,這使你在遞歸包含中不會(huì)出現(xiàn)問題。?所以,#import比起#include的好處就是它避免了重復(fù)引用的問題。所以在OC中我們基本用的都是import。
? ? #import<>?包含iOS框架類庫里的類,#import""包含項(xiàng)目里自定義的類。
3、Category是什么?擴(kuò)展一個(gè)類的方式用繼承好還是類目好?為什么?
Category是類目。用類目好,因?yàn)槔^承要滿足a?is?a?b的關(guān)系,而類目只需要滿足a?has?a?b的關(guān)系,局限性更小,你不用定義子類就能擴(kuò)展一個(gè)類的功能,還能將類的定義分開放在不同的源文件里,用Category去重寫類的方法,僅對(duì)本Category有效,不會(huì)影響到其他類與原有類的關(guān)系。
4、延展是什么?作用是什么?
延展(extension):在自己類的實(shí)現(xiàn)文件中添加類目來聲明私有方法。
5、類實(shí)例(成員)變量的@protected?,@private,@public聲明各有什么含義?
@protected:受保護(hù)的,該實(shí)例變量只能在該類和其子類內(nèi)訪問,其他類內(nèi)不能訪問。
@private:私有的,該實(shí)例變量只能在該類內(nèi)訪問,其他類內(nèi)不能訪問。
@public:共有的,該實(shí)例變量誰都可以訪問。
6、id聲明的對(duì)象有什么特性????沒有?*?號(hào)???動(dòng)態(tài)數(shù)據(jù)類型
??可以指向任何類的對(duì)象(設(shè)置是nil),而不關(guān)心其具體類型???在運(yùn)行時(shí)檢查其具體類型
??可以對(duì)其發(fā)送任何(存在的)消息
7、委托是什么?委托和委托方雙方的property聲明用什么屬性?為什么?
委托:一個(gè)對(duì)象保存另外一個(gè)對(duì)象的引用,被引用的對(duì)象實(shí)現(xiàn)了事先確定的協(xié)議,該協(xié)議用于將引用對(duì)象中的變化通知給被引用對(duì)象。
委托和委托方雙方的property聲明屬性都是assign而不是retain?為了避免循環(huán)引用造成的內(nèi)存泄露。? ? ? 循環(huán)引用的問題這樣理解:
比如在main函數(shù)中創(chuàng)建了兩個(gè)類的對(duì)象A和B,現(xiàn)在引用計(jì)數(shù)都是1?,F(xiàn)在讓A和B互相引用(A有一個(gè)屬性是B對(duì)象,屬性說明是retain;B有一個(gè)屬性是A對(duì)象,屬性說明是retain),現(xiàn)在兩個(gè)對(duì)象的引用計(jì)數(shù)都增加了1,都變成了2。? ?現(xiàn)在執(zhí)行[A?release];?[B?release];?此時(shí)創(chuàng)建對(duì)象的main函數(shù)已經(jīng)釋放了自己對(duì)對(duì)象的所有權(quán),但是此時(shí)A和B的引用計(jì)數(shù)都還是1,因?yàn)樗麄兓ハ嘁昧恕? ?這時(shí)你發(fā)現(xiàn)A和B將無法釋放,因?yàn)橐脶尫臕必須先釋放B,在B的dealloc方法中再釋放A。同理,要想釋放B必須先釋放A,在A的dealloc方法中再釋放B。所以這兩個(gè)對(duì)象將一直存在在內(nèi)存中而不釋放。這就是所謂的循環(huán)引用的問題。? ?要想解決這個(gè)問題,一般的方法可以將引用的屬性設(shè)置為assign,而不是retain來處理。
8、淺拷貝和深拷貝區(qū)別是什么?
淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對(duì)象本身。
深層復(fù)制:復(fù)制引用對(duì)象本身。
意思就是說我有個(gè)A對(duì)象,復(fù)制一份后得到A_copy對(duì)象后,對(duì)于淺復(fù)制來說,A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的只不過是是一個(gè)指針,對(duì)象本身資源還是只有一份,那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨(dú)立對(duì)象本身。?用網(wǎng)上一哥們通俗的話將就是:
淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋?深復(fù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。
9、內(nèi)存管理的幾條原則是什么?
按照默認(rèn)法則,哪些關(guān)鍵字生成的對(duì)象需要手動(dòng)釋放?哪些情況下不需要手動(dòng)釋放,會(huì)直接進(jìn)入自動(dòng)釋放池?
?? ? ? 當(dāng)使用new、alloc或copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象引用計(jì)數(shù)器為1。如果不需要使用該對(duì)象,可以向其發(fā)送release或autorelease消息,在其使用完畢時(shí)被銷毀。
?? ? ? 如果通過其他方法獲取一個(gè)對(duì)象,則可以假設(shè)這個(gè)對(duì)象引用計(jì)數(shù)為1,并且被設(shè)置為autorelease,不需要對(duì)該對(duì)象進(jìn)行清理,如果確實(shí)需要retain這個(gè)對(duì)象,則需要使用完畢后release。
?? ? ? 如果retain了某個(gè)對(duì)象,需要release或autorelease該對(duì)象,保持retain方法和release方法使用次數(shù)相等。
使用new、alloc、copy關(guān)鍵字生成的對(duì)象和retain了的對(duì)象需要手動(dòng)釋放。設(shè)置為autorelease的對(duì)象不需要手動(dòng)釋放,會(huì)直接進(jìn)入自動(dòng)釋放池。
10、怎樣實(shí)現(xiàn)一個(gè)單例模式的類,給出思路,不寫代碼。
?? ? ? 首先必須創(chuàng)建一個(gè)全局實(shí)例,通常存放在一個(gè)全局變量中,此全局變量設(shè)置為nil
?? ? ? 提供工廠方法對(duì)該全局實(shí)例進(jìn)行訪問,檢查該變量是否為nil,如果nil就創(chuàng)建一個(gè)新的實(shí)例,最后返回全局實(shí)例
?? ? ? 全局變量的初始化在第一次調(diào)用工廠方法時(shí)會(huì)在+allocWithZone:中進(jìn)行,所以需要重寫該方法,防止通過標(biāo)準(zhǔn)的alloc方式創(chuàng)建新的實(shí)例
11、類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?
答案:category?可以在不獲悉,不改變?cè)瓉泶a的情況下往里面添加新的方法,只能添加,不能刪除修改。//?category:類、種類
并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因?yàn)轭悇e具有更高的優(yōu)先級(jí)。//
12、類別跟類的優(yōu)先級(jí)?類別主要有3個(gè)作用:
(1)將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中。?(2)創(chuàng)建對(duì)私有方法的前向引用。?(3)向?qū)ο筇砑臃钦絽f(xié)議。
繼承可以增加,修改或者刪除方法,并且可以增加屬性。
//非正式協(xié)議:是使用類別category來實(shí)現(xiàn),非正式協(xié)議是NSObject的一個(gè)類別,這樣任何類的對(duì)象都可以作為委托對(duì)象來使用,它可以列出對(duì)象能夠執(zhí)行的所有方法,這樣用來實(shí)現(xiàn)委托,?我們可以使用選擇器來判斷該非正式協(xié)議中是否有這個(gè)方法。
正式協(xié)議:是一個(gè)命名的方法列表,與非正式協(xié)議相比不同的是,它要求顯示的采用協(xié)議,采用協(xié)議的方法是在類的@interface聲明中列出協(xié)議的名稱,此時(shí),實(shí)現(xiàn)協(xié)議的類應(yīng)該遵守協(xié)議,承諾實(shí)現(xiàn)協(xié)議中的所有方法。
13、 類別和類擴(kuò)展的區(qū)別。
答案:category和extensions的不同在于?后者可以添加屬性。另外后者添加的方法是必須要實(shí)現(xiàn)的extensions可以認(rèn)為是一個(gè)私有的Category。
14、.?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í)候大致看過,也寫在了學(xué)習(xí)教程里?“非正式協(xié)議概念其實(shí)就是類別的另一種表達(dá)方式“這里有一些你可能希望實(shí)現(xiàn)的方法,你可以使用他們更好的完成工作”。
這個(gè)意思是,這些是可選的。比如我門要一個(gè)更好的方法,我們就會(huì)申明一個(gè)這樣的類別去實(shí)現(xiàn)。然后你在后期可以直接使用這些更好的方法。?這么看,總覺得類別這玩意兒有點(diǎn)像協(xié)議的可選協(xié)議。"
現(xiàn)在來看,其實(shí)protocal已經(jīng)開始對(duì)兩者都統(tǒng)一和規(guī)范起來操作,因?yàn)橘Y料中說“非正式協(xié)議使用interface修飾“,
現(xiàn)在我們看到協(xié)議中兩個(gè)修飾詞:“必須實(shí)現(xiàn)(@requied)”和“可選實(shí)現(xiàn)(@optional)”。
15.什么是KVO?和?KVC?
答案:kvc:鍵?-?值編碼是一種間接訪問對(duì)象的屬性使用字符串來標(biāo)識(shí)屬性,而不是通過調(diào)用存取方法,直接或通過實(shí)例變量訪問的機(jī)制。//KVC運(yùn)用了一個(gè)isa-swizzling技術(shù)。isa-swizzling就是類型混合指針機(jī)制。KVC主要通過isa-swizzling,來實(shí)現(xiàn)其內(nèi)部查找定位的。isa指針,就是is?a?kind?of的意思,指向維護(hù)分發(fā)表的對(duì)象的類。該分發(fā)表實(shí)際上包含了指向?qū)崿F(xiàn)類中的方法的指針,和其它數(shù)據(jù)。
kvo(Key-Value?Observing):鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
用過的一個(gè)地方是對(duì)于按鈕點(diǎn)擊變化狀態(tài)的的監(jiān)控。
比如我自定義的一個(gè)button。? ?//當(dāng)屬性改變時(shí)KVO回提供自動(dòng)的消息通知。每次屬性改變了就會(huì)發(fā)送消息通知。這是因?yàn)楫?dāng)這個(gè)方案已經(jīng)被明確定義,獲得框架級(jí)支持,可以方便的采用,開法人員不需要設(shè)計(jì)自己的觀察這模型,可以直接在工程里使用。KOV的架構(gòu)可以支持多個(gè)觀察者觀察同一個(gè)屬性,以及相關(guān)值