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:0 context: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異常錯誤。 (cocoachina.com注: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。前者在初始化後的內存控件就是固定不可變的,後者可以添加等,可以動態申請新的內存空間。


8.When we call objective c is runtime language what does it mean?
我們說的obc是動態運行時語言是什麼意思?

答案:多態。 主要是將數據類型的確定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態。簡單來說,運行時機制使我們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。多態:不同對象以自己的方式響應相同的消息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。因此也可以說,運行時機制是多態的基礎?~~~


9.what is difference between NSNotification and protocol?
通知和協議的不同之處?

答案:協議有控制鏈(has-a)的關係,通知沒有。首先我一開始也不太明白,什麼叫控制鏈(專業術語了~)。但是簡單分析下通知和代理的行爲模式,我們大致可以有自己的理解簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。只是對於不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發佈會,代理人發出處理發佈會的消息後,別稱B的發佈會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關係。

10.Polymorphism
關於多態性

答案:多態,子類指針可以賦值給父類。這個題目其實可以出到一切面嚮對象語言中,因此關於多態,繼承和封裝基本最好都有個自我意識的理解,也並非一定要把書上資料上寫的能背出來。最重要的是轉化成自我理解。

11.What is responder chain?
說說響應鏈

答案: 事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下之上傳播。可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因爲問的太抽象化了嚴重懷疑題目出到越後面就越籠統。


12.Difference between frame and bounds?

framebounds有什麼不同?

答案:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)


13.What is lazy loading?

答案:懶漢模式,只在用到的時候纔去初始化。也可以理解成延時加載。我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。一個延時載,避免內存過高,一個異步加載,避免線程堵塞


14.Can we use two tableview controllers on one viewcontroller?
是否在一個視圖控制器中嵌入兩個tableview控制器?

答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認爲的UIViewController,而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController那樣的感覺。


15.Objectc的類可以多重繼承麼?可以實現多個接口麼?重寫一個類的方式用繼承好還是分類好?爲什麼?

Objective-c只支持單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,cocoa 中所有的類都是NSObject 的子類,多繼承在這裏是用protocol 委託代理 來實現的。


16.#import #include 又什麼區別 #import<> #import""又什麼區別?

答案:@class一般用於頭文件中需要聲明該類的某個實例變量的時候用到,在m文 件中還是需要使用#import而#import比起#include的好處就是不會引起交叉編譯。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章