面試題整理(三)

1.Difference between shallow copy and deep copy?
淺復制和深復制的區(qū)別?

答案:
淺層復制:只復制指向?qū)ο蟮闹羔?,而不復制引用對象本身?深層復制:復制引用對象本身。
/*
意思就是說我有個A對象,復制一份后得到A_copy對象后

對于淺復制來說,A和A_copy指向的是同一個內(nèi)存資源,復制的只不過是是一個指針,對象本身資源還是只有一份,
那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。

深復制就好理解了,內(nèi)存中存在了兩份獨立對象本身。

用網(wǎng)上一哥們通俗的話將就是:
淺復制好比你和你的影子,你完蛋,你的影子也完蛋
深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。
*/

2.What is advantage of Categories? What is difference between implementing a Category and inheritance?
類別的作用?繼承和類別在實現(xiàn)中有何區(qū)別?

答案:
Category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,
只能添加,不能刪除修改。
并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優(yōu)先級。
類別主要有3個作用:
(1)將類的實現(xiàn)分散到多個不同文件或多個不同框架中。
(2)創(chuàng)建對私有方法的前向引用。
(3)向?qū)ο筇砑臃钦絽f(xié)議。

繼承可以增加,擴展父類方法,并且可以增加屬性。

3.Difference between categories and extensions?
類別和類擴展的區(qū)別

答案:
Category和extensions的不同在于后者可以添加屬性。
另外后者添加的方法是必須要實現(xiàn)的。
extensions可以認為是一個私有的Category。

4.Difference between protocol in Objective-C and interfaces in Java?
Objective-C中的協(xié)議和Java中的接口概念有何不同?

答案:
OC中的協(xié)議有2層含義,官方定義為 formal和informal protocol。
前者和Java接口一樣。
@informal @protocol 中的方法屬于設計模式考慮范疇,不是必須實現(xiàn)的,但是如果有實現(xiàn),就會改變類的屬性。

其實關(guān)于正式協(xié)議,類別和非正式協(xié)議我很早前學習的時候大致看過,也寫在了學習教程里
"非正式協(xié)議概念其實就是類別的另一種表達方式,這里有一些你可能希望實現(xiàn)的方法,你可以使用他們更好的完成工作"。
這個意思是,這些是可選的。
比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現(xiàn)。
然后你在后期可以直接使用這些更好的方法。
總的來說類別這玩意兒有點像協(xié)議的可選協(xié)議.

現(xiàn)在來看,其實protocal已經(jīng)開始對兩者都統(tǒng)一和規(guī)范起來操作,因為資料中說"非正式協(xié)議使用interface修飾",
現(xiàn)在我們看到協(xié)議中兩個修飾詞:"必須實現(xiàn)(@requied)"和"可選實現(xiàn)(@optional)"。

OC中的協(xié)議(formal protocol)與java中的接口概念基本一致,
OC中非正式協(xié)議(informal protocol)就是類別。

在java中如果繼承了接口,但不實現(xiàn)其方法,會得到一個error(無法編譯);

在OC中的正式協(xié)議,如果不實現(xiàn),會得到一個warning(可編譯執(zhí)行),
如果想去除waring,還可以加關(guān)鍵字(@optional),讓它可選實現(xiàn)方法。

5.What are KVO and KVC?

答案:
KVC: 鍵 - 值編碼
/*
是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調(diào)用存取方法,直接或通過實例變量訪問的機制。 
很多情況下可以簡化程序代碼。
apple文檔其實給了一個很好的例子。
*/
KVO: 鍵值觀察機制
/*
他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
具體用看到嗯哼用到過的一個地方是對于按鈕點擊變化狀態(tài)的的監(jiān)控。
*/

比如我自定義的一個UIButton

[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]; 
    } 
} 

//對于系統(tǒng)是根據(jù)keypath去取的到相應的值發(fā)生改變,理論上來說是和kvc機制的道理是一樣的。

對于KVC機制如何通過key尋找到value:
當通過KVC調(diào)用對象時,比如:
[self valueForKey:@"someKey"] 時,
/*
程序會自動試圖通過幾種不同的方式解析這個調(diào)用。
首先查找對象是否帶有 someKey 這個方法,
如果沒找到,會繼續(xù)查找對象是否帶有someKey這個實例變量(iVar),
如果還沒有找到,程序會繼續(xù)試圖調(diào)用 - (id)valueForUndefinedKey:這個方法。
如果這個方法還是沒有被實現(xiàn)的話,程序會拋出一個NSUndefinedKeyException異常錯誤。
 */

/*
cocoachina.com注:
Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,
還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。
同時,查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在.
*/
 
設計 "valueForUndefinedKey:" 方法的主要目的是當你使用 -(id)valueForKey 方法從對象中請求值時,
對象能夠在錯誤發(fā)生前,有最后的機會響應這個請求。
這樣做有很多好處,上面的例子也說明了這樣做的好處.

"因為我們知道button卻是存在一個highlighted實例變量.因此為何上面我們只是add一個相關(guān)的keypath就行了"
可以按照KVC查找的邏輯理解。
*/

6.What is purpose of delegates?
代理的作用?

答案:
/*
代理的目的是改變或傳遞控制鏈。
允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。
另外一點,代理可以理解為java中的回調(diào)監(jiān)聽機制的一種類似。
*/

7.What are mutable and immutable types in Objective C?
Objective-C中可修改和不可以修改類型。

答案:
可修改不可修改的集合類。
這個我個人簡單理解就是可動態(tài)添加修改和不可動態(tài)添加修改一樣。
比如NSArray和NSMutableArray。
/*
前者在初始化后的內(nèi)存控件就是固定不可變的,
后者可以添加等,可以動態(tài)申請新的內(nèi)存空間。
*/

8.When we call Objective-C is runtime language what does it mean?
我們說的Objective-C是動態(tài)運行時語言是什么意思?

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

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

答案:
協(xié)議有控制鏈(has-a)的關(guān)系,通知沒有。
/*
1.通知:
  通知需要有一個通知中心:NSNotificationCenter,自定義通知的話需要給一個名字,然后監(jiān)聽。

    優(yōu)點:通知的發(fā)送者和接受者都不需要知道對方??梢灾付ń邮胀ㄖ木唧w方法。通知名可以是任何字符串。

    缺點:較鍵值觀察(KVO)需要多點代碼,在刪掉前必須移除監(jiān)聽者。

2.協(xié)議
  通過setDelegate來設置代理對象,最典型的例子是常用的TableView.
    優(yōu)點:支持它的類有詳盡和具體信息。
    缺點:該類必須支持委托。某一時間只能有一個委托連接到某一對象。
*/

通俗點講
1)通知只負責發(fā)出通知,剩下的事情就不管了,所以沒有返回值,可以說是一對多;
2)delegate只是一對一,delegate方法往往需要關(guān)注返回值,也就是delegate方法的結(jié)果。



"控制鏈has-a"的具體理解,可自行百度。
*/

10.What is push notification?
什么是推送消息?

答案:
iOS中消息推送機制又叫消息機制,其包括兩類:
1.本地通知;
2.推送通知,也叫遠程通知。

/*
兩種通知在iOS中的表現(xiàn)一致,可以通過橫幅或者彈出提醒兩種形式告訴用戶,
并且點擊通知可以會打開應用程序,但是實現(xiàn)原理卻完全不同:

本地通知是由本地應用觸發(fā)的,它是基于時間行為的一種通知形式; 
推送通知是由應用服務提供商發(fā)起的,通過蘋果的APNs(Apple Push Notification Server)發(fā)送到應用客戶端.
*/

11.Polymorphism?
關(guān)于多態(tài)性

答案:
多態(tài):不同對象以自己的方式"響應相同的消息"(執(zhí)行相同名稱的函數(shù)方法)的能力叫做多態(tài)。

/*
由于每個類都有屬于該類的命名空間,這使得多態(tài)名稱變?yōu)榭赡堋?類中定義的函數(shù)(方法)名字和類外定義的函數(shù)(方法)名字并不會沖突。

類的實例變量和類方法有如下特點:

C語言中結(jié)構(gòu)體中的數(shù)據(jù)成員一樣,類的實例變量也位于該類獨有的命名空間。

類方法也同樣位于該類獨有的名字空間。與C語言中的方法名不同,類的方法名并不是一個全局符號。
一個類中的方法名不會和其他類中同樣的方法名沖突。
兩個完全不同的類可以實現(xiàn)同一個方法。

方法名是對象接口的一部分。對象收到的消息的名字就是調(diào)用的方法的名字。
因為不同的對象可以有同名的方法,所以對象必須能理解消息的含義。
同樣的消息發(fā)給不同的對象,導致的操作并不相同。

多態(tài)的主要好處就是簡化了編程接口。
它容許在類和類之間重用一些習慣性的命名,而不用為每一個新加的函數(shù)命名一個新名字。
這樣,編程接口就是一些抽象的行為的集合,從而和實現(xiàn)接口的類的區(qū)分開來。
*/
注意:Objective-C支持方法名的多態(tài),但不支持參數(shù)和操作符的多態(tài)。

12.Singleton?
對于單例的理解

答案:
單例的目的就是為了在程序的整個生命周期內(nèi),只會創(chuàng)建一個類的實例對象,而且只要程序不被殺死,該實例對象就不會被釋放。
/*
單例是編程語言必備的基礎。
基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。
進一步的話,考慮下如何在多線程訪問單例時的安全性。
*/

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

答案: 
事件響應鏈。包括點擊事件,畫面刷新事件等都是響應鏈的一種形態(tài)。
在視圖棧內(nèi)從上至下,或者從下之上傳播。
可以說說點擊事件的步驟,太抽象化了,沒法寫

14.Difference between frame and bounds?
frame和bounds有什么不同?

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

15.Difference between method and selector?
方法和選擇器有何不同?

答案:
@selector 是一個方法的名字
"method"  是一個組合體,包含了方法名和實現(xiàn).
具體不解析

16.Is there any garbage collection mechanism in Objective C.?
OC的垃圾回收機制?

答案: 
OC是支持垃圾回收機制的(Garbage collection簡稱GC),
macOS開發(fā)中是支持的,但是iOS中,是不支持GC的。

/*
iOS開發(fā)是支持ARC(Automatic Reference Counting的簡稱),ARC是在IOS5之后推出的新技術(shù),它與GC的機制是不同的。
我們在編寫代碼時, 
不需要向?qū)ο蟀l(fā)送release或者autorelease方法,
也不可以調(diào)用delloc方法,
編譯器會在合適的位置自動給用戶生成release消息(autorelease),

ARC 的特點是自動引用技術(shù)簡化了內(nèi)存管理的難度.
*/

17.NSOperation queue?

答案:
存放NSOperation的集合類。
操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發(fā)的問題。
//暫無更多詳情,待修改

18.What is lazy loading?

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

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是否可以關(guān)聯(lián)兩個不同的數(shù)據(jù)源?你會怎么處理?

答案:可以關(guān)聯(lián)兩個數(shù)據(jù)源,不過相對來說比較麻煩
數(shù)據(jù)源里的實現(xiàn)方法必須判斷數(shù)據(jù),比如不同的數(shù)據(jù)集合有不同的下標個數(shù)用于展示行數(shù),以及展示的cell,并且cell的點擊事件也要做相應的判斷.常見的處理方法是在當前控制器生成成員屬性記錄當前顯示枚舉.

未完成,待整理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 11,113評論 0 23
  • 可能是天氣的原因吧 最近情緒不是很高漲 放假已經(jīng)有幾天了,可是每到晚上天黑的時候總是有種明天還要上...
    唐竹秋的女朋友閱讀 228評論 0 0
  • 好吧,這篇blog距離第一篇的確時間有點太著急了,不過這不恰恰能說明我干嘛這么著急注冊blog,寫blog呢。因為...
    別著急我來了閱讀 447評論 0 1
  • 這次,是第二次閱讀《明朝那些事》,感覺有了新的收獲。 第一次閱讀,完全為里面精彩萬分的內(nèi)容吸引;第二次閱讀,卻是被...
    不達目的不改昵稱閱讀 311評論 0 1
  • 春天的氣息越來越濃了,我的工作也越來越忙了,難得今天上午沒什么事,提筆作畫。 先顯擺一下今天的天氣,對于堅持處于霧...
    時光蓮心閱讀 331評論 1 2

友情鏈接更多精彩內(nèi)容