真實面試題總結-某金融公司

1、Notifiaction響應順序?擴展問題:如何讓NSNotifiication的post處和observer處異步執(zhí)行?

對于同一個通知,如果注冊了多個觀察者,則多個觀察者的執(zhí)行順序和他們注冊的順序保持一致,同步執(zhí)行只有接受者執(zhí)行完畢返回后,才會通知下一個觀察者。

通過NSNotificationQueue實現(xiàn)
NSNotificationQueue:通知隊列,用來管理多個通知的調(diào)用。通知隊列通常以先進先出(FIFO)順序維護。NSNotificationQueue就像一個緩沖池把一個個通知放進池子中,使用特定方式通過NSNotificationCenter發(fā)送到相應的觀察者。

  • NSPostWhenIdle:空閑發(fā)送通知,當RunLoop處于等待或空閑狀態(tài)時,發(fā)送通知,對于不重要的通知可以使用。
  • NSPostASAP:盡快發(fā)送通知,當前RunLoop迭代完成時,通知將會被發(fā)送,有點類似沒有延遲的定時器。
  • NSPostNow :同步發(fā)送通知,如果不使用合并通知和postNotification:一樣是同步通知。

2、串行隊列,執(zhí)行同步任務是否開啟子線程?擴展問題:并發(fā)隊列,同步任務是否開啟子線程?主隊列加入同步任務會?

(1)串行隊列同步任務,不開啟子線程
(2)并發(fā)隊列同步任務,不開啟子線程
(3)造成死鎖

3、GCD 控制線程數(shù)量

GCD通過信號量可以達到控制線程數(shù)量的效果。

- (void)gcd_max_queue
{
    dispatch_queue_t taskConcurrentQueue = dispatch_queue_create("com.task", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t serialQueue = dispatch_queue_create("com.serial", DISPATCH_QUEUE_SERIAL);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(4);
    for(NSIntegeri =0; i <10; i++) {
        dispatch_async(serialQueue, ^{        dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
            dispatch_async(taskConcurrentQueue, ^{
                NSLog(@"開始執(zhí)行任務 %@", [NSThreadcurrentThread]);
                sleep(i%4);
                NSLog(@"執(zhí)行任務結束 %@", [NSThreadcurrentThread]);
                dispatch_semaphore_signal(semaphore);
            });
        });
    }
}

4、OC如何實現(xiàn)多繼承?

OC中沒有多繼承,可以通過類的組合,協(xié)議,擴展實現(xiàn)類似多繼承的效果,也可以使用runtime。

5、Nsstring *a = [Nsdate alloc] init];在編譯時和運行時分別是什么類型?

編譯時a為NSString類型,運行時為NSDate類型,如果運行時調(diào)用String相關方法會引起崩潰。

6、有哪些情況引起bad_access崩潰?擴展:如何調(diào)試?

(1)野指針
(2)空指針異常
(3)死循環(huán)
(4)死遞歸

開啟全局斷點,開啟僵尸對象,開啟AddressSentlize

7、分類如何添加屬性?

正常情況下,分類是不可以添加屬性的,因為runtime中對于Category的定義中,沒有存放屬性的指針,所以分類可以增加實力方法,類方法,協(xié)議等。但是可以通過runtime的動態(tài)綁定來實現(xiàn):
objc_setAssociatedObject()
objc_getAssociatedObject();

8、Hook?如何實現(xiàn)?

使用runtime 動態(tài)交換方法,在+(load)中,注意循環(huán)調(diào)用

9、MD5,散列碰撞,出現(xiàn)碰撞如何規(guī)避,如何降低概率?

使用base64和md5算法聯(lián)合使用,可以降低一些,并在md5之后,base64 decode 校驗
使用md5和sha1,將md5和sha1相加,再md5

10、framework,動態(tài),靜態(tài),library?

靜態(tài)庫與動態(tài)庫的區(qū)別
首先來看什么是庫,庫(Library)說白了就是一段編譯好的二進制代碼,加上頭文件就可以供別人使用。
什么時候我們會用到庫呢?一種情況是某些代碼需要給別人使用,但是我們不希望別人看到源碼,就需要以庫的形式進行封裝,只暴露出頭文件。另外一種情況是,對于某些不會進行大的改動的代碼,我們想減少編譯的時間,就可以把它打包成庫,因為庫是已經(jīng)編譯好的二進制了,編譯的時候只需要 Link 一下,不會浪費編譯時間。
上面提到庫在使用的時候需要 Link,Link 的方式有兩種,靜態(tài)和動態(tài),于是便產(chǎn)生了靜態(tài)庫和動態(tài)庫。
靜態(tài)庫
靜態(tài)庫即靜態(tài)鏈接庫(Windows 下的 .lib,linux 和 Mac 下的 .a)。之所以叫做靜態(tài),是因為靜態(tài)庫在編譯的時候會被直接拷貝一份,復制到目標程序里,這段代碼在目標程序里就不會再改變了。
靜態(tài)庫的好處很明顯,編譯完成之后,庫文件實際上就沒有作用了。目標程序沒有外部依賴,直接就可以運行。當然其缺點也很明顯,就是會使用目標程序的體積增大。
動態(tài)庫
動態(tài)庫即動態(tài)鏈接庫(Windows 下的 .dll,Linux 下的 .so,Mac 下的 .dylib)。與靜態(tài)庫相反,動態(tài)庫在編譯時并不會被拷貝到目標程序中,目標程序中只會存儲指向動態(tài)庫的引用。等到程序運行時,動態(tài)庫才會被真正加載進來。
動態(tài)庫的優(yōu)點是,不需要拷貝到目標程序中,不會影響目標程序的體積,而且同一份庫可以被多個程序使用(因為這個原因,動態(tài)庫也被稱作共享庫)。同時,編譯時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯代碼。動態(tài)庫帶來的問題主要是,動態(tài)載入會帶來一部分性能損失,使用動態(tài)庫也會使得程序依賴于外部環(huán)境。如果環(huán)境缺少動態(tài)庫或者庫的版本不正確,就會導致程序無法運行(Linux 下喜聞樂見的 lib not found 錯誤)。
iOS Framework
除了上面提到的 .a 和 .dylib 之外,Mac OS/iOS 平臺還可以使用 Framework。Framework 實際上是一種打包方式,將庫的二進制文件,頭文件和有關的資源文件打包到一起,方便管理和分發(fā)。
在 iOS 8 之前,iOS 平臺不支持使用動態(tài) Framework,開發(fā)者可以使用的 Framework 只有蘋果自家的 UIKit.Framework,F(xiàn)oundation.Framework 等。這種限制可能是出于安全的考慮(見這里的討論)。換一個角度講,因為 iOS 應用都是運行在沙盒當中,不同的程序之間不能共享代碼,同時動態(tài)下載代碼又是被蘋果明令禁止的,沒辦法發(fā)揮出動態(tài)庫的優(yōu)勢,實際上動態(tài)庫也就沒有存在的必要了。
由于上面提到的限制,開發(fā)者想要在 iOS 平臺共享代碼,唯一的選擇就是打包成靜態(tài)庫 .a 文件,同時附上頭文件(例如微信的SDK)。但是這樣的打包方式不夠方便,使用時也比較麻煩,大家還是希望共享代碼都能能像 Framework 一樣,直接扔到工程里就可以用。于是人們想出了各種奇技淫巧去讓 Xcode Build 出 iOS 可以使用的 Framework,具體做法參考這里和這里,這種方法產(chǎn)生的 Framework 還有 “偽”(Fake) Framework 和 “真“(Real) Framework 的區(qū)別。
iOS 8/Xcode 6 推出之后,iOS 平臺添加了動態(tài)庫的支持,同時 Xcode 6 也原生自帶了 Framework 支持(動態(tài)和靜態(tài)都可以),上面提到的的奇技淫巧也就沒有必要了(新的做法參考這里)。為什么 iOS 8 要添加動態(tài)庫的支持?唯一的理由大概就是 Extension 的出現(xiàn)。Extension 和 App 是兩個分開的可執(zhí)行文件,同時需要共享代碼,這種情況下動態(tài)庫的支持就是必不可少的了。但是這種動態(tài) Framework 和系統(tǒng)的 UIKit.Framework 還是有很大區(qū)別。系統(tǒng)的 Framework 不需要拷貝到目標程序中,我們自己做出來的 Framework 哪怕是動態(tài)的,最后也還是要拷貝到 App 中(App 和 Extension 的 Bundle 是共享的),因此蘋果又把這種 Framework 稱為 Embedded Framework。

11、數(shù)組去重,查找重復數(shù)據(jù),如果用for寫的算法的時間復雜度?

結合set去重,使用for嵌套寫的算法,時間復雜度n^2
(1)、無序去重
set,dic
( 2)、有序去重
開品新的數(shù)組,for循環(huán) containsobject

12、雙向冒泡法?最理想的情況的時間復雜度與最不理想的情況的時間復雜度?

13、Masonry的設計思想?

簡化的設計模式:工廠類&工廠方法
MASConstraintMaker類就是一個工廠類,負責創(chuàng)建MASConstraint類型的對象(依賴于MASConstraint接口,而不依賴于具體實現(xiàn))。在UIView的View+MASAdditions分類中就是調(diào)用的MASConstraintMaker類中的一些方法。上述我們在使用Masonry給subView添加約束時,mas_makeConstraints方法中的Block的參數(shù)就是MASConstraintMaker的對象。用戶可以通過該Block回調(diào)過來的MASConstraintMaker對象給View指定要添加的約束以及該約束的值。該工廠中的constraints屬性數(shù)組就記錄了該工廠創(chuàng)建的所有MASConstraint對象。

組合模式
鏈式編程

14、app里有多個音頻sdk交叉使用,其中某一個突然無法播放聲音,但獨立使用時沒有問題的,如何定位?

avaudioseesion,搶占主聲道資源,

15、多個sdk如何根據(jù)直播間動態(tài)調(diào)配sdk?

使用工廠管理實例應該可以做到

16、二叉樹是什么?什么情況下使用?如何做平衡?

二叉樹是每個節(jié)點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”,左子樹和右子樹同時也是二叉樹。二叉樹的子樹有左右之分,并且次序不能任意顛倒。二叉樹是遞歸定義的,所以一般二叉樹的相關題目也都可以使用遞歸的思想來解決,當然也有一些可以使用非遞歸的思想解決,我下面列出的一些算法有些采用了遞歸,有些是非遞歸的。
快速搜索,大數(shù)據(jù)插入,刪除,

17、封裝sdk要注意哪些事項?

? 確保外部調(diào)用簡單,且保證有詳細的頭文件注釋說明。
? 確保API編碼規(guī)范,保證風格統(tǒng)一。
? 確保API易擴展,可以考慮預留參數(shù)
? 確保沒有外部依賴或者依賴要盡可能的少,以保證公共庫的純潔(原則上不能有外部依賴)
? 確保易維護,不存在冗余API

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

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,621評論 1 32
  • 每到初夏,最開心的事莫過于半夜在陽臺光著膀子吹風,風一陣一陣的吹來,一旁樹葉吹的沙沙作響,仿佛有了面朝大海的感覺,...
    AurevoirCo閱讀 187評論 0 0
  • 今天,脈脈老師告訴我:我們都是凡人,是數(shù)億計中的一份子,但我們每一個人又是獨一無二的,是特殊的。我想:我終...
    北座城市閱讀 131評論 0 1
  • 這兩天你在背英語單詞方面有很大的長勁,這要感謝同行的人。 難怪古人說:“三人行必有我?guī)煟 庇泻糜讶缬泻绵?,如?..
    走過路過就好閱讀 222評論 0 1
  • 十六章 赤壁賦 讓我感觸最深的一次是聽經(jīng)典朗誦,氣勢磅礴,身臨其境,融入其中。在黃州,蘇東坡過的就是神仙...
    冰清_e7cc閱讀 356評論 0 0

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