此份面試題包含40個題目,是現在網上能搜尋到的一個比較熱的一份,但是答案並不是很詳細和完整,基本答案來著cocoaChina,和一些自己的補充。
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?
oc中的協議和java中的介面概念有何不同?
答案:OC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java介面一樣。
informal protocol中的方法屬於設計模式考慮範疇,不是必須實現的,但是如果有實現,就會改變類的屬性。
其實關於正式協議,類別和非正式協議我很早前學習的時候大致看過,也寫在了學習教程裡
“非正式協議概念其實就是類別的另一種表達方式“這裡有一些你可能希望實現的方法,你可以使用他們更好的完成工作”。
這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現。然後你在後期可以直接使用這些更好的方法。
這麼看,總覺得類別這玩意兒有點像協議的可選協議。"
現在來看,其實protocal已經開始對兩者都統一和規範起來操作,因為資料中說“非正式協議使用interface修飾“,
現在我們看到協議中兩個修飾詞:“必須實現(@requied)”和“可選實現(@optional)”。
5.What are KVO and KVC?
答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字串來識別屬性,而不是通過調用存取方法,直接或通過執行個體變數訪問的機制。
很多情況下可以簡化程式碼。apple文檔其實給了一個很好的例子。
kvo:索引值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
具體用看到嗯哼用到過的一個地方是對於按鈕點擊變化狀態的的監控。
比如我自訂的一個button
[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?
oc中可修改和不可以修改類型。
答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態添加修改和不可動態添加修改一樣。
比如NSArray和NSMutableArray。前者在初始化後的記憶體控制項就是固定不可變的,後者可以添加等,可以動態申請新的記憶體空間。
8.When we call objective c is runtime language what does it mean?
我們說的oc是動態運行時語言是什麼意思?
答案:多態。 主要是將資料類型的確定由編譯時間,延遲到了運行時。
這個問題其實淺涉及到兩個概念,運行時和多態。
簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。
多態:不同對象以自己的方式響應相同的訊息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;
那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。
也就是不同的對象以自己的方式響應了相同的訊息(響應了eat這個選取器)。
因此也可以說,運行時機制是多態的基礎?~~~
9.what is difference between NSNotification and protocol?
通知和協議的不同之處?
答案:協議有控制鏈(has-a)的關係,通知沒有。
首先我一開始也不太明白,什麼叫控制鏈(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解
簡單來說,通知的話,它可以一對多,一條訊息可以發送給多個訊息接受者。
代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。
只是對於不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發布會,代理人發出處理髮布會的訊息後,別稱B的
發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。
因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關係。
10.What is push notification?
什麼是推送訊息?
答案:太簡單,不作答~~~~~~~~~~
這是cocoa上的答案。
其實到不是說太簡單,只是太泛泛的一個概念的東西。就好比說,什麼是人。
推播通知更是一種技術。
簡單點就是用戶端擷取資源的一種手段。
普通情況下,都是用戶端主動的pull。
推送則是伺服器端主動push。
11.Polymorphism?
關於多態性
答案:多態,子類指標可以賦值給父類。
這個題目其實可以出到一切物件導向語言中,
因此關於多態,繼承和封裝基本最好都有個自我意識的理解,也並非一定要把書上資料上寫的能背出來。
最重要的是轉化成自我理解。
12.Singleton?
對於單例的理解
答案:11,12題目其實出的有點泛泛的感覺了,可能說是程式設計語言需要或是必備的基礎。
基本能用熟悉的語言寫出一個單例,以及可以運用到的情境或是你編程中碰到過運用的此種模式的架構類等。
進一步點,考慮下如何在多線程訪問單例時的安全性。
13.What is responder chain?
說說響應鏈
答案: 事件響應鏈。包括點擊事件,畫面重新整理事件等。在視圖棧內從上至下,或者從下之上傳播。
可以說時間點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了
嚴重懷疑題目出到越後面就越籠統。
14.Difference between frame and bounds?
frame和bounds有什麼不同?
答案:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)
bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)
15.Difference between method and selector?
方法和選取器有何不同?
答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現.
詳情可以看apple文檔。
16.Is there any garbage collection mechanism in Objective C.?
OC的記憶體回收機制?
答案: OC2.0有Garbage collection,但是iOS平台不提供。
一般我們瞭解的objective-c對於記憶體管理都是手動操作的,但是也有自動釋放池。
但是差了大部分資料,貌似不要和arc機制搞混就好了。
求更多~~
17.NSOperation queue?
答案:存放NSOperation的集合類。
操作和操作隊列,基本可以看成java中的線程和線程池的概念。用於處理ios多線程開發的問題。
網上部分資料提到一點是,雖然是queue,但是卻並不是帶有隊列的概念,放入的操作並非是按照嚴格的先進現出。
這邊又有個疑點是,對於隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必然的,
但是Bfunc是等Afunc完全操作完以後,B才開始啟動並且執行,因此隊列的概念離亂上有點違背了多執行緒這個概念。
但是轉念一想其實可以參考銀行的取票和叫號系統。
因此對於A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。
但是後來看到一票關於這操作隊列話題的文章,其中有一句提到
“因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”
瞬間覺得這個queue名字有點忽悠人了,還不如pool~
綜合一點,我們知道他可以比較大的用處在於可以幫組多線程編程就好了。
18.What is lazy loading?
答案:懶漢模式,只在用到的時候才去初始化。
也可以理解成延時載入。
我覺得最好也最簡單的一個列子就是tableView中圖片的載入顯示了。
一個延時載,避免記憶體過高,一個非同步載入,避免線程堵塞。
19.Can we use two tableview controllers on one viewcontroller?
是否在一個視圖控制器中嵌入兩個tableview控制器?
答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,
只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,
而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController
那樣的感覺。
20.Can we use one tableview with two different datasources? How you will achieve this?
一個tableView是否可以關聯兩個不同的資料來源?你會怎麼處理?
答案:首先我們從代碼來看,資料來源如何關聯上的,其實是在資料來源關聯的代理方法裡實現的。
因此我們並不關心如何去關聯他,他怎麼關聯上,方法只是讓我返回根據自己的需要去設定如相關的資料來源。
因此,我覺得可以設定多個資料來源啊,但是有個問題是,你這是想幹嘛呢?想讓列表如何顯示,不同的資料來源分區塊顯示?
本身這個ios面試題集綿有40個題目,但是後面的20個基本都沒答案,那位lz直接是:”後面的太簡單,就不多說了~~~“
並且答案的話也是概述性而非直接可以定義的。
因此,下禮拜我抽空把剩下20個題覺得有點意思的挑出來,然後在找找其他的,準備再湊20題。