ios高級面試題及答案
ios高級面試題及答案一
1. Object-c的類可以多繼承么?category是什么?重寫一個類的方式用繼承好還是分類好?為什么?
答:Object-c的類不可以多重繼承,可以用偽繼承和@protocol委托來代替;可以實現多個接口,通過實現多個接口就可以完成C++的多重繼承,Category是類別,一般用分類比較好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關系。
偽繼承必須覆蓋兩個方法,即methodSignatureForSelector: 和 forwardInvocation:。methodSignatureForSelector:的作用在于為另一個類實現的消息創建一個有效的方法簽名。forwardInvocation:將選擇器轉發給一個真正實現了該消息的對象.
2. 類別的作用?繼承和類別在實現中有何區別?
答:category可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。并且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。
類別主要有3個作用:(1)將類的實現分散到多個不同文件或多個不同框架中。(2)創建對私有方法的前向引用。(3)向對象添加非正式協議。繼承可以增加,修改或者刪除方法,并且可以增加屬性。
/* 非正式協議:是使用類別category來實現,非正式協議是NSObject的一個類別,這樣任何類的對象都可以作為委托對象來使用,它可以列出對象能夠執行的所有方法,這樣用來實現委托, 我們可以使用選擇器來判斷該非正式協議中是否有這個方法。正式協議:是一個命名的方法列表,與非正式協議相比不同的是,它要求顯示的采用協議,采用協議的方法是在類的@interface聲明中列出協議的名稱,此時,實現協議的類應該遵守協議,承諾實現協議中的所有方法。 */
3. 類別和類擴展的區別?
答:1."類別"比"子類"方便多了,因為對已添加category的類,使用到它或者它的子類的地方,category都會起作用;“子類”的話,則需要在使用的每個地方,創建子類對象
2."類別"只能添加方法,不能加屬性、變量
3."類別"一般是對框架提供類的擴展(沒有源碼,不能修改)
4."類別"一般是在不想生成一個新的子類的情況下,比如對NSArray的擴展 “擴展”則相當于定義一個子類,在里面添加屬性和方法
4. 屬性readwrite,readonly,assign,retain,copy,nonatomic各是什么作用,在哪種情況下用?什么情況使用weak關鍵字,相比assign有什么不同?
答:1> readwrite:同時生成get方法和set方法的聲明和實現
2> readonly:只生成get方法的聲明和實現
3> assign:set方法的實現是直接賦值,用于基本數據類型
4> retain:set方法的實現是release舊值,retain新值,用于OC對象類型
5> copy:set方法的實現是release舊值,copy新值,用于NSString、block等類型
6> nonatomic:非原子性,set方法的實現不加鎖(比atomic性能高) 注意點:(nonatomic)非原子性訪問,對屬性賦值的時候不加鎖,多線程并發訪問會提高性能。如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。(atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。
5. 寫一個setter方法用于完成@property(nonatomic,retain)NSString * name,寫一個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高級面試題及答案二
1. 看下面的程序,第一個NSLog會輸出什么?這時str的retaincount是多少?第二個和第三個呢?為什么?
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創建+1,retain+1,加入數組自動+1
3
retain+1,release-1,release-1
2
數組刪除所有對象,所有數組內的對象自動-1
1
2. 這個寫法會出什么問題:@property(copy)NSMutableArray * array;
答:01、添加,刪除,修改數組內的元素的時候,程序會因為找不到對應的方法而崩潰.因為copy就是復制一個不可變NSArray的對象;
02、使用了atomic屬性會嚴重影響性能。
3. objc使用什么機制管理對象內存?
答:引用計數機制:對象創建后,運行時系統通過對象維護的一個計數器來描述有多少個其他對象在使用自己,當計數器為0時,釋放該對象占用的內存空間(該對象調用dealloc方法)。
1).MRC(manual retain-release)手動內存管理
2).ARC(automatic reference counting)自動引用計數ARC作為LLVM(編譯器的架構系統,用c++編寫而成的) 3.0編譯器的一項特性, 在iOS5.0 (Xcode4) 版本后推出的自動內存管理, 蘋果推薦使用ARC技術來管理內存, 節約時間 , 提高效率 , 減少代碼量 , 降低出錯幾率. 開發者不需要再手動寫入retain,release,autorelease三個關鍵字,手動管理內存, 編譯器將自動在代碼合適的地方插入retain,release,autorelease進行內存管理.ARC的判斷準則, 只要沒有強指針指向對象, 對象就會被釋放.
4. 內存管理的幾條原則是什么?按照默認法則,哪些關鍵字生成的對象需要手動釋放?在和property結合的時候怎樣有效的避免內存泄漏?
答:誰申請,誰釋放
遵循Cocoa Touch的使用原則;
內存管理主要要避免“過早釋放”和“內存泄漏”,對于“過早釋放”需要 關鍵字alloc 或new 生成的對象需要手動釋放;
設置正確的property屬性,對于retain需要在合適的地方釋放;
注意@property設置特性時,一定要用對特性關鍵字,對于“內存泄漏”,一定要申請了要負責釋放,要細心。
另:當使用new、alloc或copy方法創建一個對象時,該對象引用計數器為1。如果不需要使用該對象,可以向其發送release或autorelease消息,在其使用完畢時被銷毀。如果通過其他方法獲取一個對象,則可以假設這個對象引用計數為1,并且被設置為autorelease,不需要對該對象進行清理,如果確實需要retain這個對象,則需要使用完畢后release。如果retain了某個對象,需要release或autorelease該對象,保持retain方法和release方法使用次數相等。使用new、alloc、copy關鍵字生成的對象和retain了的對象需要手動釋放。設置為autorelease的對象不需要手動釋放,會直接進入自動釋放池。
ios高級面試題及答案三
1.Difference between shallow copy and deep copy?淺復制和深復制的區別?
答案:淺層復制:只復制指向對象的指針,而不復制引用對象本身。 深層復制:復制引用對象本身。 意思就是說我有個A對象,復制一份后得到A_copy對象后,對于淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象本身資源 還是只有一份,那如果我們對A_copy執行了修改操作,那么發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了 兩份獨立對象本身。 用網上一哥們通俗的話將就是: 淺復制好比你和你的影子,你完蛋,你的影子也完蛋 深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。
2.What is advantage of categories? What is difference between implementing a category and inheritance?類別的作用?繼承和類別在實現中有何區別?
答案:category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。 并且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。 類別主要有3個作用: (1)將類的實現分散到多個不同文件或多個不同框架中。 (2)創建對私有方法的前向引用。 (3)向對象添加非正式協議。 繼承可以增加,修改或者刪除方法,并且可以增加屬性。
3.Difference between categories and extensions?類別和類擴展的區別。
答案:category和extensions的不同在于 后者可以添加屬性。另外后者添加的方法是必須要實現的。 extensions可以認為是一個私有的Category。
4.Difference between protocol in objective c and interfaces in java?obc中的協議和java中的接口概念有何不同?
答案:OBC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。 informal protocol中的方法屬于設計模式考慮范疇,不是必須實現的,但是如果有實現,就會改變類的屬性。 其實關于正式協議,類別和非正式協議我很早前學習的時候大致看過,也寫在了學習教程里 “非正式協議概念其實就是類別的另一種表達方式“這里有一些你可能希望實現的方法,你可以使用他們更好的完成工作”。 這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現。然后你在后期可以直接使用這些更好的方法。 這么看,總覺得類別這玩意兒有點像協議的可選協議。" 現在來看,其實protocal已經開始對兩者都統一和規范起來操作,因為資料中說“非正式協議使用interface修飾“, 現在我們看到協議中兩個修飾詞:“必須實現(@requied)”和“可選實現(@optional)”。
5.What are KVO and KVC?
答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調用存取方法,直接或通過實例變量訪問的機制。 很多情況下可以簡化程序代碼。apple文檔其實給了一個很好的例子。 kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。 具體用看到嗯哼用到過的一個地方是對于按鈕點擊變化狀態的的監控。 比如我自定義的一個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]; } }
對于系統是根據keypath去取的到相應的值發生改變,理論上來說是和kvc機制的道理是一樣的。 對于kvc機制如何通過key尋找到value: “當通過KVC調用對象時,比如:[self valueForKey:@”someKey”]時,程序會自動試圖通過幾種不同的方式解析這個調用。首先查找對象是否帶有 someKey 這個方法,如果沒找到,會繼續查找對象是否帶有someKey這個實例變量(iVar),如果還沒有找到,程序會繼續試圖調用 -(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。 (注:Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。) 設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發生前,有最后的機會響應這個請求。這樣做有很多好處,下面的兩個例子說明了這樣做的好處。“ 來至cocoa,這個說法應該挺有道理。 因為我們知道button卻是存在一個highlighted實例變量.因此為何上面我們只是add一個相關的keypath就行了, 可以按照kvc查找的邏輯理解,就說的過去了。
6.What is purpose of delegates?代理的作用?
答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。 另外一點,代理可以理解為java中的回調監聽機制的一種類似。
7.What are mutable and immutable types in Objective C?obc中可修改和不可以修改類型。
答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態添加修改和不可動態添加修改一樣。 比如NSArray和NSMutableArray。前者在初始化后的內存控件就是固定不可變的,后者可以添加等,可以動態申請新的內存空間。