3月7日 面試ios工程師面試題

1.淺拷貝和深拷貝的區別?

淺拷貝:對指向對象的指針進行拷貝
深拷貝:直接拷貝對象到內存中一塊區域,然後把新對象的指針指向這塊內存

遵循NSCopying協議的可以使用淺拷貝,遵循NSMutbaleCopying協議的可以使用深拷貝。(沒有遵循協議進行使用會發生異常)。

系統非容器類對象(NSString這樣的)
不可變對象調用copy或mutbalecopy符合深拷貝淺拷貝定義。
可變對象調用Copy和MutableCopy方法都會重新分配一塊內存。但是copy和mutableCopy的區別在於copy在複製對象的時候其實是返回了一個不可變對象,因此當調用方法改變對象的時候會崩潰

系統容器類對象(NSArray這樣的)
不可變對象:容器對象和非容器對象在分別調用Copy和MutableCopy時沒有什麼分別,不可變對象調用Copy方法只是增加了對原對象的指針的引用,調用MutableCopy方法是重新分配一塊內存,然後把新對象指向新內存。
可變對象:而對於可變對象不管調用Copy還是MutableCopy都是新分配一塊內存。但是雖然重新分配了一塊內存,但是對象裏面的數據依然是指針複製的,下面我們來看一段代碼:
對於系統容器類對象,其元素對象始終是指針複製。(理由是原對象改變值不管是調用copy還是mutablecopy,其上面的值都會跟着改變)。

2.簡述OC中內存管理機制。readonly、assign、copy、strong、weak屬性的作用?什麼情況下用?

readonly此標記說明屬性只可以讀,也就是不能設置,可以獲取。readonly 是隻讀特性 只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變
assign不會使引用計數加1,也就是直接賦值。assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;
copy 建立一個索引計數爲1的對象,在賦值時使用傳入值的一份拷貝。copy 表示賦值特性,setter方法將傳入對象複製一份;需要完全一份新的變量時。
strong:打開ARC時纔會使用,相當於retain。
weak:打開ARC時纔會使用,相當於assign,可以把對應的指針變量置爲nil

3.反向傳值怎樣做,常用幾種方法。參考文章:http://blog.csdn.net/shi520fu/article/details/61194541

4.ios的沙河目錄結構是怎樣的?參考文章:http://blog.csdn.net/wzzvictory/article/details/18269713

1、MyApp.app
2、Documents
3、Documents/Inbox
4Library
5Library/Caches
6Library/Preferences
7、tmp

5.GCD與NSOperation的區別。參考文章:https://www.jianshu.com/p/d09e2638eb27

GCD 技術是一個輕量的,底層實現隱藏的神奇技術,我們能夠通過GCD和block輕鬆實現多線程編程,有時候,GCD相比其他系統提供的多線程方法更加有效,當然,有時候GCD不是最佳選擇,另一個多線程編程的技術 NSOprationQueue 讓我們能夠將後臺線程以隊列方式依序執行,並提供更多操作的入口,這和 GCD 的實現有些類似。

GCD是底層的C語言構成的API,而NSOperationQueue及相關對象是Objc的對象。在GCD中,在隊列中執行的是由block構成的任務,這是一個輕量級的數據結構;而Operation作爲一個對象,爲我們提供了更多的選擇;

作者:王小明if
鏈接:https://www.jianshu.com/p/d09e2638eb27
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

6.代理和Block的區別。

blockdelegate 都可以通知外面。block 更輕型,使用更簡單,能夠直接訪問上下文,這樣類中不需要存儲臨時數據,使用 block 的代碼通常會在同一個地方,這樣讀代碼也連貫。delegate 更重一些,需要實現接口,它的方法分離開來,很多時候需要存儲一些臨時數據,另外相關的代碼會被分離到各處,沒有 block 好讀。應該優先使用 block。而有兩個情況可以考慮 delegate1. 有多個相關方法。假如每個方法都設置一個 block, 這樣會更麻煩。而 delegate 讓多個方法分成一組,只需要設置一次,就可以多次回調。當多於 3 個方法時就應該優先採用 delegate。比如一個網絡類,假如只有成功和失敗兩種情況,每個方法可以設計成單獨 block。但假如存在多個方法,比如有成功、失敗、緩存、https 驗證,網絡進度等等,這種情況下,delegate 就要比 block 要好。

作者:黃兢成
鏈接:https://www.zhihu.com/question/29023547/answer/109570584
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

應用範圍:
如果這個回調是一個不定期觸發,或者會多次觸發的,那麼 Delegation 應該更適合;如果這個回調是一個一次性的,並且和調用方法是單線性關係的,那麼 Block 應該更適合;如果這個回調是廣播性質的,需要很多個不同的類都接收到,那麼 NSNotification 更適合。在不同的執行線(不是線程),不同的執行次數、執行數量上的區別,是鑑別使用哪一種回調的最好判斷方法。

作者:Bill Cheng
鏈接:https://www.zhihu.com/question/29023547/answer/110199052
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

7.UITableview的優化方法。
8.runloop和線程有什麼關係?主線程默認開啓了runloop?子線程呢?
9.進程和線程的區別?
10.冒泡排序。

NSMutableArray *arr_M = [NSMutableArray arrayWithObjects:@1,@4,@2,@3,@5,nil];

    //遍歷`數組的個數`次
    /*
     i = 0 的時候,j的相鄰兩個位置都要比較排一下位置:
         j = 0 的時候:arr_M = 41235
         j = 1 的時候:arr_M = 42135
         j = 2 的時候:arr_M = 42315
         j = 3 的時候:arr_M = 42351

     i = 1;
      ……  ……
     */
    for (int i = 0; i < arr_M.count; ++i) {

        //遍歷數組的每一個`索引`(不包括最後一個,因爲比較的是j+1for (int j = 0; j < arr_M.count-1; ++j) {

            //根據索引的`相鄰兩位`進行`比較`
            if (arr_M[j] < arr_M[j+1]) {

                [arr_M exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }

        }
    }

    NSLog(@"最終結果:%@",arr_M);

作者:Se7ven
鏈接:https://www.jianshu.com/p/a466e9033dd2
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

11.做過地圖(百度地圖)上面的Baidu Logo如何消掉。
12.Block傳值如何讓變量有效?
13.通知如何傳多個值?
14.環信的聊天組等等如何保持長時間運行不斷線(用socket長連接)。

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