注:我只是網(wǎng)絡(luò)的搬運(yùn)工锭部。有需要的可以看一下驯耻。。
簡(jiǎn)答題
1鞠苟、Objective-C的類可以多重繼承么鬓照?可以采用多個(gè)協(xié)議么熔酷?
不可以多重繼承,可以采用多個(gè)協(xié)議颖杏。
2纯陨、#import和#include的區(qū)別是什么?#import<>?跟?#import""有什么區(qū)別留储?
#import能避免頭文件被重復(fù)包含的問(wèn)題:
? ? 1.?一般來(lái)說(shuō),導(dǎo)入objective?c的頭文件時(shí)用#import咙轩,包含c/c++頭文件時(shí)用#include获讳。
使用include要注意重復(fù)引用的問(wèn)題:
? ? ?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)問(wèn)題钾菊。?所以帅矗,#import比起#include的好處就是它避免了重復(fù)引用的問(wèn)題。所以在OC中我們基本用的都是import煞烫。
? ? #import<>?包含iOS框架類庫(kù)里的類浑此,#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)文件中添加類目來(lái)聲明私有方法黍聂。
5躺苦、類實(shí)例(成員)變量的@protected?,@private,@public聲明各有什么含義?
@protected:受保護(hù)的产还,該實(shí)例變量只能在該類和其子類內(nèi)訪問(wèn)匹厘,其他類內(nèi)不能訪問(wèn)。
@private:私有的脐区,該實(shí)例變量只能在該類內(nèi)訪問(wèn)愈诚,其他類內(nèi)不能訪問(wèn)。
@public:共有的牛隅,該實(shí)例變量誰(shuí)都可以訪問(wèn)炕柔。
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)引用的問(wèn)題這樣理解:
比如在main函數(shù)中創(chuàng)建了兩個(gè)類的對(duì)象A和B掐隐,現(xiàn)在引用計(jì)數(shù)都是1。現(xiàn)在讓A和B互相引用(A有一個(gè)屬性是B對(duì)象捕捂,屬性說(shuō)明是retain瑟枫;B有一個(gè)屬性是A對(duì)象,屬性說(shuō)明是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將無(wú)法釋放虑啤,因?yàn)橐脶尫臕必須先釋放B,在B的dealloc方法中再釋放A架馋。同理狞山,要想釋放B必須先釋放A,在A的dealloc方法中再釋放B叉寂。所以這兩個(gè)對(duì)象將一直存在在內(nèi)存中而不釋放萍启。這就是所謂的循環(huán)引用的問(wèn)題。? ?要想解決這個(gè)問(wèn)題屏鳍,一般的方法可以將引用的屬性設(shè)置為assign,而不是retain來(lái)處理勘纯。
8、淺拷貝和深拷貝區(qū)別是什么钓瞭?
淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔槻底瘢粡?fù)制引用對(duì)象本身。
深層復(fù)制:復(fù)制引用對(duì)象本身山涡。
意思就是說(shuō)我有個(gè)A對(duì)象堤结,復(fù)制一份后得到A_copy對(duì)象后,對(duì)于淺復(fù)制來(lái)說(shuō)鸭丛,A和A_copy指向的是同一個(gè)內(nèi)存資源竞穷,復(fù)制的只不過(guò)是是一個(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í)被銷毀。
?? ? ? 如果通過(guò)其他方法獲取一個(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)行訪問(wèn)强经,檢查該變量是否為nil,如果nil就創(chuàng)建一個(gè)新的實(shí)例寺渗,最后返回全局實(shí)例
?? ? ? 全局變量的初始化在第一次調(diào)用工廠方法時(shí)會(huì)在+allocWithZone:中進(jìn)行匿情,所以需要重寫該方法,防止通過(guò)標(biāo)準(zhǔn)的alloc方式創(chuàng)建新的實(shí)例
11信殊、類別的作用炬称?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?
答案:category?可以在不獲悉涡拘,不改變?cè)瓉?lái)代碼的情況下往里面添加新的方法玲躯,只能添加,不能刪除修改鳄乏。//?category:類跷车、種類
并且如果類別和原來(lái)類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來(lái)的方法橱野,因?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來(lái)實(shí)現(xiàn),非正式協(xié)議是NSObject的一個(gè)類別劳坑,這樣任何類的對(duì)象都可以作為委托對(duì)象來(lái)使用毕谴,它可以列出對(duì)象能夠執(zhí)行的所有方法,這樣用來(lái)實(shí)現(xiàn)委托距芬,?我們可以使用選擇器來(lái)判斷該非正式協(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í)候大致看過(guò)业崖,也寫在了學(xué)習(xí)教程里?“非正式協(xié)議概念其實(shí)就是類別的另一種表達(dá)方式“這里有一些你可能希望實(shí)現(xiàn)的方法野芒,你可以使用他們更好的完成工作”。
這個(gè)意思是双炕,這些是可選的狞悲。比如我門要一個(gè)更好的方法,我們就會(huì)申明一個(gè)這樣的類別去實(shí)現(xiàn)妇斤。然后你在后期可以直接使用這些更好的方法摇锋。?這么看丹拯,總覺得類別這玩意兒有點(diǎn)像協(xié)議的可選協(xié)議。"
現(xiàn)在來(lái)看荸恕,其實(shí)protocal已經(jīng)開始對(duì)兩者都統(tǒng)一和規(guī)范起來(lái)操作乖酬,因?yàn)橘Y料中說(shuō)“非正式協(xié)議使用interface修飾“,
現(xiàn)在我們看到協(xié)議中兩個(gè)修飾詞:“必須實(shí)現(xiàn)(@requied)”和“可選實(shí)現(xiàn)(@optional)”融求。
15.什么是KVO?和?KVC?
答案:kvc:鍵?-?值編碼是一種間接訪問(wèn)對(duì)象的屬性使用字符串來(lái)標(biāo)識(shí)屬性咬像,而不是通過(guò)調(diào)用存取方法,直接或通過(guò)實(shí)例變量訪問(wèn)的機(jī)制生宛。//KVC運(yùn)用了一個(gè)isa-swizzling技術(shù)县昂。isa-swizzling就是類型混合指針機(jī)制。KVC主要通過(guò)isa-swizzling陷舅,來(lái)實(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ī)制,他提供了觀察某一屬性變化的方法缩赛,極大的簡(jiǎn)化了代碼耙箍。
用過(guò)的一個(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)值