ios面試題02

來源:互聯網
上載者:User

淺複製和深複製的區別?//淺拷貝和深拷貝
答案:
淺層複製(copy):只複製指向對象的指標,而不複製引用對象本身。//通過對象的指標來訪問這個對象
深層複製(mutableCopy):複製引用對象本身
意思就是有個A對象,複製一份後得到A_copy對象後,對於淺複製來說,A和A_copy指向的是同一個記憶體資源,複製的只不過是是一個指標,對象本身資源
還是只有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的對象同樣被修改,這其實違背了我們複製拷貝的一個思想。深複製就好理解了,記憶體中存在了
兩份獨立對象本身。//當修改A時,A copy不變。

打個比喻:1、淺拷貝就是:你掛了,你媽媽喊你回家吃飯時找不到人了,她很傷心。2、深拷貝就是:你複製了一個你自己:你掛了、你兄弟還在,你媽媽喊你回家吃飯時能找到人。所以、孩子,安全起見、深拷貝吧,記得記憶體管理就是了。

類別的作用?繼承和類別在實現中有何區別?
答案:category 可以在不獲悉,不改變原來代碼的情況下往裡面添加新的方法,只能添加,不能刪除修改。// category:類、種類
並且如果類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,因為類別具有更高的優先順序。//類別跟類的優先順序
類別主要有3個作用:
(1)將類的實現分散到多個不同檔案或多個不同架構中。
(2)建立對私人方法的前向引用。
(3)向對象添加非正式協議。
 繼承可以增加,修改或者刪除方法,並且可以增加屬性。
//非正式協議:是使用類別category來實現,非正式協議是NSObject的一個類別,這樣任何類的對象都可以作為委派物件來使用,它可以列出對象能夠執行的所有方法,這樣用來實現委託, 我們可以使用選取器來判斷該非正式協議中是否有這個方法。
正式協議:是一個命名的方法列表,與非正式協議相比不同的是,它要求顯示的採用協議,採用協議的方法是在類的@interface聲明中列出協議的名稱,此時,實現協議的類應該遵守協議,承諾實現協議中的所有方法。

3 類別和類擴充的區別。
 答案:category和extensions的不同在於 後者可以添加屬性。另外後者添加的方法是必須要實現的。
extensions可以認為是一個私人的Category。
4. oc中的協議和java中的介面概念有何不同?
答案:OC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java介面一樣。
informal protocol中的方法屬於設計模式考慮範疇,不是必須實現的,但是如果有實現,就會改變類的屬性。
其實關於正式協議,類別和非正式協議我很早前學習的時候大致看過,也寫在了學習教程裡
“非正式協議概念其實就是類別的另一種表達方式“這裡有一些你可能希望實現的方法,你可以使用他們更好的完成工作”。
這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現。然後你在後期可以直接使用這些更好的方法。
這麼看,總覺得類別這玩意兒有點像協議的可選協議。"
現在來看,其實protocal已經開始對兩者都統一和規範起來操作,因為資料中說“非正式協議使用interface修飾“,
現在我們看到協議中兩個修飾詞:“必須實現(@requied)”和“可選實現(@optional)”。
5.什麼是KVO 和 KVC?
答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字串來識別屬性,而不是通過調用存取方法,直接或通過執行個體變數訪問的機制。//KVC運用了一個isa-swizzling技術。isa-swizzling就是類型混合指標機制。KVC主要通過isa-swizzling,來實現其內部尋找定位的。isa指標,就是is a kind of的意思,指向維護分發表的對象的類。該分發表實際上包含了指向實作類別中的方法的指標,和其它資料。

 

kvo(Key-Value Observing):索引值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
用過的一個地方是對於按鈕點擊變化狀態的的監控。
比如我自訂的一個button。   //當屬性改變時KVO回提供自動的訊息通知。每次屬性改變了就會發送訊息通知。這是因為當這個方案已經被明確定義,獲得架構級支援,可以方便的採用,開法人員不需要設計自己的觀察這模型,可以直接在工程裡使用。KOV的架構可以支援多個觀察者觀察同一個屬性,以及相關值。

[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.代理的作用?
答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要擷取到那些類的指標。可以減少架構複雜度。

7.oc中可修改和不可以修改類型。
答案:就是可動態添加修改和不可動態添加修改一樣。
比如NSArray和NSMutableArray。前者在初始化後的記憶體控制項就是固定不可變的,後者可以添加等,可以動態申請新的記憶體空間。
8.我們說的oc是動態運行時語言是什麼意思?
答案:多態。 主要是將資料類型的確定由編譯時間,延遲到了運行時。
這個問題其實淺涉及到兩個概念,運行時和多態。
運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。
多態:不同對象以自己的方式響應相同的訊息的能力叫做多態。
//都用有一個相同的方法,不同的對象以自己的方式響應了相同的訊息.
因此也可以說,運行時機制是多態的基礎
9.通知和協議的不同之處?
答案:協議有控制鏈(has-a)的關係,通知沒有。//通知:它可以一對多,一條訊息可以發送給多個訊息接受者,但是不會處理訊息
控制鏈:單一擁有和可控制的對應關係。
10.關於多態性
答案:多態,子類指標可以賦值給父類。
對象不僅僅可以已本身的類型存在,也可以作為其父類類型存在。 多態性是允許將父物件設定成為和一個或多個它的子物件相等的技術, 多態性使得能夠利用同一類(基類)類型的指標來引用不同類的對象,以及根據所引用對象的不同,以不同的方式執行相同的操作.

11.說說響應鏈
答案: 事件響應鏈。包括點擊事件,畫面重新整理事件等。在視圖棧內從上至下,或者從下之上傳播。
12. frame和bounds有什麼不同?
答案:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)//frame:架構、結構
bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)//bounds:界限
14. NSOperation隊列
操作和操作隊列,基本可以看成java中的線程和線程池的概念。用於處理ios多線程開發的問題。
網上部分資料提到一點是,雖然是queue,但是卻並不是帶有隊列的概念,放入的操作並非是按照嚴格的先進現出。
這邊又有個疑點是,對於隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必然的,
但是Bfunc是等Afunc完全操作完以後,B才開始啟動並且執行,因此隊列的概念離亂上有點違背了多執行緒這個概念。
但是轉念一想其實可以參考銀行的取票和叫號系統。
因此對於A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。
但是後來看到一票關於這操作隊列話題的文章,其中有一句提到
“因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”
瞬間覺得這個queue名字有點忽悠人了,還不如pool~
綜合一點,我們知道他可以比較大的用處在於可以幫組多線程編程就好了。
15.是否在一個視圖控制器中嵌入兩個tableview控制器?
答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,
只能說可以嵌入一個tableview視圖。而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController

16. 一個tableView是否可以關聯兩個不同的資料來源?你會怎麼處理?
答案:首先從代碼來看,資料來源如何關聯上的,其實是在資料來源關聯的代理方法裡實現的。
 
    
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   if(indexPath.section == 0)
   {
   }
   if(indexPath.section == 1)
   {
   }
}
17. 什麼是id類型
id類型的變數可以存放任何資料類型的對象。在內部處理上,這種類型被定義為指向對象的指標,實際上是一個指向這種對象的執行個體變數的指標。
例如:id number
將number聲明為id類型的變數。可聲明的方法使其具有id類型的傳回值,如下:
-(id)newObject;(int)type;
這個程式聲明了一個名為newObject的執行個體方法,它具有名為type的單個整型參數並有id類型的傳回值。應該注意的是,對傳回值和參數型別宣告來說,id是預設的類型。
id類型是objetive-c中非常中藥店額資料類型,它是多態和動態綁定的基礎。

 

    
    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.