- 相關(guān)推薦
ios高級(jí)面試題及答案
ISO高級(jí)工程師面試前也不能怠慢,做好準(zhǔn)備才是最好的,以下是陽(yáng)光網(wǎng)小編為大家整理的ios高級(jí)面試題及答案,希望可以幫到大家。ios高級(jí)面試題及答案一
1. Object-c的類可以多繼承么?category是什么?重寫一個(gè)類的方式用繼承好還是分類好?為什么?
答:Object-c的類不可以多重繼承,可以用偽繼承和@protocol委托來代替;可以實(shí)現(xiàn)多個(gè)接口,通過實(shí)現(xiàn)多個(gè)接口就可以完成C++的多重繼承,Category是類別,一般用分類比較好,用Category去重寫類的方法,僅對(duì)本Category有效,不會(huì)影響到其他類與原有類的關(guān)系。
偽繼承必須覆蓋兩個(gè)方法,即methodSignatureForSelector: 和 forwardInvocation:。methodSignatureForSelector:的作用在于為另一個(gè)類實(shí)現(xiàn)的消息創(chuàng)建一個(gè)有效的方法簽名。forwardInvocation:將選擇器轉(zhuǎn)發(fā)給一個(gè)真正實(shí)現(xiàn)了該消息的對(duì)象.
2. 類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?
答:category可以在不獲悉,不改變?cè)瓉泶a的情況下往里面添加新的方法,只能添加,不能刪除修改。并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因?yàn)轭悇e具有更高的優(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é)議中的所有方法。 */
3. 類別和類擴(kuò)展的區(qū)別?
答:1."類別"比"子類"方便多了,因?yàn)閷?duì)已添加category的類,使用到它或者它的子類的地方,category都會(huì)起作用;“子類”的話,則需要在使用的每個(gè)地方,創(chuàng)建子類對(duì)象
2."類別"只能添加方法,不能加屬性、變量
3."類別"一般是對(duì)框架提供類的擴(kuò)展(沒有源碼,不能修改)
4."類別"一般是在不想生成一個(gè)新的子類的情況下,比如對(duì)NSArray的擴(kuò)展 “擴(kuò)展”則相當(dāng)于定義一個(gè)子類,在里面添加屬性和方法
4. 屬性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在哪種情況下用?什么情況使用weak關(guān)鍵字,相比assign有什么不同?
答:1> readwrite:同時(shí)生成get方法和set方法的聲明和實(shí)現(xiàn)
2> readonly:只生成get方法的聲明和實(shí)現(xiàn)
3> assign:set方法的實(shí)現(xiàn)是直接賦值,用于基本數(shù)據(jù)類型
4> retain:set方法的實(shí)現(xiàn)是release舊值,retain新值,用于OC對(duì)象類型
5> copy:set方法的實(shí)現(xiàn)是release舊值,copy新值,用于NSString、block等類型
6> nonatomic:非原子性,set方法的實(shí)現(xiàn)不加鎖(比atomic性能高) 注意點(diǎn):(nonatomic)非原子性訪問,對(duì)屬性賦值的時(shí)候不加鎖,多線程并發(fā)訪問會(huì)提高性能。如果不加此屬性,則默認(rèn)是兩個(gè)訪問方法都為原子型事務(wù)訪問。(atomic是Objc使用的一種線程保護(hù)技術(shù),基本上來講,是防止在寫未完成的時(shí)候被另外一個(gè)線程讀取,造成數(shù)據(jù)錯(cuò)誤。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個(gè)非常好的選擇。
5. 寫一個(gè)setter方法用于完成@property(nonatomic,retain)NSString * name,寫一個(gè)setter方法用于完成@property(nonatomic,copy)NSString * name; 答:- (void)setName:(NSString *) str
{
[str retain];
[name release];
name = str;
}
- (void)setName:(NSString *)str
{
id t = [str copy];
[name release];
name = t;
}
ios高級(jí)面試題及答案二
1. 看下面的程序,第一個(gè)NSLog會(huì)輸出什么?這時(shí)str的retaincount是多少?第二個(gè)和第三個(gè)呢?為什么?
NSMutableArray * ary = [[NSMutableArray array] retain];
NSString * str = [NSString stringWithFormat:@”test”];
[str retain];
[ary addObject:str];
NSLog(@”%@%d”,str,[str retainCount]);
[str retain];
[str release];
[str release];
NSLog(@”%@%d”,str,[str retainCount]);
[ary removeAllObjects];
NSLog(@”%@%d”,str,[str retainCount]);
答:str的retainCount創(chuàng)建+1,retain+1,加入數(shù)組自動(dòng)+1
3
retain+1,release-1,release-1
2
數(shù)組刪除所有對(duì)象,所有數(shù)組內(nèi)的對(duì)象自動(dòng)-1
1
2. 這個(gè)寫法會(huì)出什么問題:@property(copy)NSMutableArray * array;
答:01、添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法而崩潰.因?yàn)閏opy就是復(fù)制一個(gè)不可變NSArray的對(duì)象;
02、使用了atomic屬性會(huì)嚴(yán)重影響性能。
3. objc使用什么機(jī)制管理對(duì)象內(nèi)存?
答:引用計(jì)數(shù)機(jī)制:對(duì)象創(chuàng)建后,運(yùn)行時(shí)系統(tǒng)通過對(duì)象維護(hù)的一個(gè)計(jì)數(shù)器來描述有多少個(gè)其他對(duì)象在使用自己,當(dāng)計(jì)數(shù)器為0時(shí),釋放該對(duì)象占用的內(nèi)存空間(該對(duì)象調(diào)用dealloc方法)。
1).MRC(manual retain-release)手動(dòng)內(nèi)存管理
2).ARC(automatic reference counting)自動(dòng)引用計(jì)數(shù)ARC作為L(zhǎng)LVM(編譯器的架構(gòu)系統(tǒng),用c++編寫而成的) 3.0編譯器的一項(xiàng)特性, 在iOS5.0 (Xcode4) 版本后推出的自動(dòng)內(nèi)存管理, 蘋果推薦使用ARC技術(shù)來管理內(nèi)存, 節(jié)約時(shí)間 , 提高效率 , 減少代碼量 , 降低出錯(cuò)幾率. 開發(fā)者不需要再手動(dòng)寫入retain,release,autorelease三個(gè)關(guān)鍵字,手動(dòng)管理內(nèi)存, 編譯器將自動(dòng)在代碼合適的地方插入retain,release,autorelease進(jìn)行內(nèi)存管理.ARC的判斷準(zhǔn)則, 只要沒有強(qiáng)指針指向?qū)ο? 對(duì)象就會(huì)被釋放.
4. 內(nèi)存管理的幾條原則是什么?按照默認(rèn)法則,哪些關(guān)鍵字生成的對(duì)象需要手動(dòng)釋放?在和property結(jié)合的時(shí)候怎樣有效的避免內(nèi)存泄漏?
答:誰(shuí)申請(qǐng),誰(shuí)釋放
遵循Cocoa Touch的使用原則;
內(nèi)存管理主要要避免“過早釋放”和“內(nèi)存泄漏”,對(duì)于“過早釋放”需要 關(guān)鍵字alloc 或new 生成的對(duì)象需要手動(dòng)釋放;
設(shè)置正確的property屬性,對(duì)于retain需要在合適的地方釋放;
注意@property設(shè)置特性時(shí),一定要用對(duì)特性關(guān)鍵字,對(duì)于“內(nèi)存泄漏”,一定要申請(qǐng)了要負(fù)責(zé)釋放,要細(xì)心。
另:當(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)釋放池。
ios高級(jí)面試題及答案三
1.Difference between shallow copy and deep copy?淺復(fù)制和深復(fù)制的區(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ù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。
2.What is advantage of categories? What is difference between implementing a category and inheritance?類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?
答案:category 可以在不獲悉,不改變?cè)瓉泶a的情況下往里面添加新的方法,只能添加,不能刪除修改。 并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因?yàn)轭悇e具有更高的優(yōu)先級(jí)。 類別主要有3個(gè)作用: (1)將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中。 (2)創(chuàng)建對(duì)私有方法的前向引用。 (3)向?qū)ο筇砑臃钦絽f(xié)議。 繼承可以增加,修改或者刪除方法,并且可以增加屬性。
3.Difference between categories and extensions?類別和類擴(kuò)展的區(qū)別。
答案:category和extensions的不同在于 后者可以添加屬性。另外后者添加的方法是必須要實(shí)現(xiàn)的。 extensions可以認(rèn)為是一個(gè)私有的Category。
4.Difference between protocol in objective c and interfaces in java?obc中的協(xié)議和java中的接口概念有何不同?
答案:OBC中的代理有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)”。
5.What are KVO and KVC?
答案:kvc:鍵 - 值編碼是一種間接訪問對(duì)象的屬性使用字符串來標(biāo)識(shí)屬性,而不是通過調(diào)用存取方法,直接或通過實(shí)例變量訪問的機(jī)制。 很多情況下可以簡(jiǎn)化程序代碼。apple文檔其實(shí)給了一個(gè)很好的例子。 kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡(jiǎn)化了代碼。 具體用看到嗯哼用到過的一個(gè)地方是對(duì)于按鈕點(diǎn)擊變化狀態(tài)的的監(jiān)控。 比如我自定義的一個(gè)button [cpp] [self addObserver:self forKeyPath:@"highlighted" options:0context:nil]; #pragma mark KVO - (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"highlighted"] ) { [self setNeedsDisplay]; } }
對(duì)于系統(tǒng)是根據(jù)keypath去取的到相應(yīng)的值發(fā)生改變,理論上來說是和kvc機(jī)制的道理是一樣的。 對(duì)于kvc機(jī)制如何通過key尋找到value: “當(dāng)通過KVC調(diào)用對(duì)象時(shí),比如:[self valueForKey:@”someKey”]時(shí),程序會(huì)自動(dòng)試圖通過幾種不同的方式解析這個(gè)調(diào)用。首先查找對(duì)象是否帶有 someKey 這個(gè)方法,如果沒找到,會(huì)繼續(xù)查找對(duì)象是否帶有someKey這個(gè)實(shí)例變量(iVar),如果還沒有找到,程序會(huì)繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個(gè)方法。如果這個(gè)方法還是沒有被實(shí)現(xiàn)的話,程序會(huì)拋出一個(gè)NSUndefinedKeyException異常錯(cuò)誤。 (注:Key-Value Coding查找方法的時(shí)候,不僅僅會(huì)查找someKey這個(gè)方法,還會(huì)查找getsomeKey這個(gè)方法,前面加一個(gè)get,或者_(dá)someKey以及_getsomeKey這幾種形式。同時(shí),查找實(shí)例變量的時(shí)候也會(huì)不僅僅查找someKey這個(gè)變量,也會(huì)查找_someKey這個(gè)變量是否存在。) 設(shè)計(jì)valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey方法從對(duì)象中請(qǐng)求值時(shí),對(duì)象能夠在錯(cuò)誤發(fā)生前,有最后的機(jī)會(huì)響應(yīng)這個(gè)請(qǐng)求。這樣做有很多好處,下面的兩個(gè)例子說明了這樣做的好處。“ 來至cocoa,這個(gè)說法應(yīng)該挺有道理。 因?yàn)槲覀冎纀utton卻是存在一個(gè)highlighted實(shí)例變量.因此為何上面我們只是add一個(gè)相關(guān)的keypath就行了, 可以按照kvc查找的邏輯理解,就說的過去了。
6.What is purpose of delegates?代理的作用?
答案:代理的目的是改變或傳遞控制鏈。允許一個(gè)類在某些特定時(shí)刻通知到其他類,而不需要獲取到那些類的指針?梢詼p少框架復(fù)雜度。 另外一點(diǎn),代理可以理解為java中的回調(diào)監(jiān)聽機(jī)制的一種類似。
7.What are mutable and immutable types in Objective C?obc中可修改和不可以修改類型。
答案:可修改不可修改的集合類。這個(gè)我個(gè)人簡(jiǎn)單理解就是可動(dòng)態(tài)添加修改和不可動(dòng)態(tài)添加修改一樣。 比如NSArray和NSMutableArray。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動(dòng)態(tài)申請(qǐng)新的內(nèi)存空間。
【ios高級(jí)面試題及答案】相關(guān)文章:
ios面試題及答案201812-06
高級(jí)ios工程師面試題12-09
高級(jí)java面試題及答案04-04
java高級(jí)面試題及答案04-06
php高級(jí)面試題及答案04-02
java高級(jí)工程師面試題及答案04-05
java高級(jí)面試題04-06
經(jīng)典面試題及答案04-04
面試題及答案04-04