1邦投、Notifiaction響應(yīng)順序厅篓?擴(kuò)展問(wèn)題:如何讓NSNotifiication的post處和observer處異步執(zhí)行一姿?
對(duì)于同一個(gè)通知,如果注冊(cè)了多個(gè)觀察者摘仅,則多個(gè)觀察者的執(zhí)行順序和他們注冊(cè)的順序保持一致靶庙,同步執(zhí)行只有接受者執(zhí)行完畢返回后,才會(huì)通知下一個(gè)觀察者娃属。
通過(guò)NSNotificationQueue實(shí)現(xiàn)
NSNotificationQueue:通知隊(duì)列六荒,用來(lái)管理多個(gè)通知的調(diào)用。通知隊(duì)列通常以先進(jìn)先出(FIFO)順序維護(hù)矾端。NSNotificationQueue就像一個(gè)緩沖池把一個(gè)個(gè)通知放進(jìn)池子中掏击,使用特定方式通過(guò)NSNotificationCenter發(fā)送到相應(yīng)的觀察者。
- NSPostWhenIdle:空閑發(fā)送通知秩铆,當(dāng)RunLoop處于等待或空閑狀態(tài)時(shí)砚亭,發(fā)送通知,對(duì)于不重要的通知可以使用殴玛。
- NSPostASAP:盡快發(fā)送通知捅膘,當(dāng)前RunLoop迭代完成時(shí),通知將會(huì)被發(fā)送滚粟,有點(diǎn)類似沒(méi)有延遲的定時(shí)器寻仗。
- NSPostNow :同步發(fā)送通知,如果不使用合并通知和postNotification:一樣是同步通知凡壤。
2署尤、串行隊(duì)列,執(zhí)行同步任務(wù)是否開(kāi)啟子線程亚侠?擴(kuò)展問(wèn)題:并發(fā)隊(duì)列曹体,同步任務(wù)是否開(kāi)啟子線程?主隊(duì)列加入同步任務(wù)會(huì)硝烂?
(1)串行隊(duì)列同步任務(wù)箕别,不開(kāi)啟子線程
(2)并發(fā)隊(duì)列同步任務(wù),不開(kāi)啟子線程
(3)造成死鎖
3钢坦、GCD 控制線程數(shù)量
GCD通過(guò)信號(hào)量可以達(dá)到控制線程數(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(@"開(kāi)始執(zhí)行任務(wù) %@", [NSThreadcurrentThread]);
sleep(i%4);
NSLog(@"執(zhí)行任務(wù)結(jié)束 %@", [NSThreadcurrentThread]);
dispatch_semaphore_signal(semaphore);
});
});
}
}
4、OC如何實(shí)現(xiàn)多繼承爹凹?
OC中沒(méi)有多繼承厨诸,可以通過(guò)類的組合,協(xié)議禾酱,擴(kuò)展實(shí)現(xiàn)類似多繼承的效果微酬,也可以使用runtime绘趋。
5、Nsstring *a = [Nsdate alloc] init];在編譯時(shí)和運(yùn)行時(shí)分別是什么類型颗管?
編譯時(shí)a為NSString類型陷遮,運(yùn)行時(shí)為NSDate類型,如果運(yùn)行時(shí)調(diào)用String相關(guān)方法會(huì)引起崩潰垦江。
6帽馋、有哪些情況引起bad_access崩潰?擴(kuò)展:如何調(diào)試比吭?
(1)野指針
(2)空指針異常
(3)死循環(huán)
(4)死遞歸
開(kāi)啟全局?jǐn)帱c(diǎn)绽族,開(kāi)啟僵尸對(duì)象,開(kāi)啟AddressSentlize
7衩藤、分類如何添加屬性吧慢?
正常情況下,分類是不可以添加屬性的赏表,因?yàn)閞untime中對(duì)于Category的定義中检诗,沒(méi)有存放屬性的指針,所以分類可以增加實(shí)力方法瓢剿,類方法逢慌,協(xié)議等。但是可以通過(guò)runtime的動(dòng)態(tài)綁定來(lái)實(shí)現(xiàn):
objc_setAssociatedObject()
objc_getAssociatedObject()间狂;
8涕癣、Hook?如何實(shí)現(xiàn)前标?
使用runtime 動(dòng)態(tài)交換方法,在+(load)中距潘,注意循環(huán)調(diào)用
9炼列、MD5,散列碰撞音比,出現(xiàn)碰撞如何規(guī)避俭尖,如何降低概率?
使用base64和md5算法聯(lián)合使用洞翩,可以降低一些稽犁,并在md5之后,base64 decode 校驗(yàn)
使用md5和sha1骚亿,將md5和sha1相加已亥,再md5
10、framework来屠,動(dòng)態(tài)虑椎,靜態(tài)震鹉,library?
靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別
首先來(lái)看什么是庫(kù)捆姜,庫(kù)(Library)說(shuō)白了就是一段編譯好的二進(jìn)制代碼传趾,加上頭文件就可以供別人使用。
什么時(shí)候我們會(huì)用到庫(kù)呢泥技?一種情況是某些代碼需要給別人使用浆兰,但是我們不希望別人看到源碼,就需要以庫(kù)的形式進(jìn)行封裝珊豹,只暴露出頭文件簸呈。另外一種情況是,對(duì)于某些不會(huì)進(jìn)行大的改動(dòng)的代碼平夜,我們想減少編譯的時(shí)間蝶棋,就可以把它打包成庫(kù),因?yàn)閹?kù)是已經(jīng)編譯好的二進(jìn)制了忽妒,編譯的時(shí)候只需要 Link 一下玩裙,不會(huì)浪費(fèi)編譯時(shí)間。
上面提到庫(kù)在使用的時(shí)候需要 Link段直,Link 的方式有兩種吃溅,靜態(tài)和動(dòng)態(tài),于是便產(chǎn)生了靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)鸯檬。
靜態(tài)庫(kù)
靜態(tài)庫(kù)即靜態(tài)鏈接庫(kù)(Windows 下的 .lib决侈,linux 和 Mac 下的 .a)。之所以叫做靜態(tài)喧务,是因?yàn)殪o態(tài)庫(kù)在編譯的時(shí)候會(huì)被直接拷貝一份赖歌,復(fù)制到目標(biāo)程序里,這段代碼在目標(biāo)程序里就不會(huì)再改變了功茴。
靜態(tài)庫(kù)的好處很明顯庐冯,編譯完成之后,庫(kù)文件實(shí)際上就沒(méi)有作用了坎穿。目標(biāo)程序沒(méi)有外部依賴展父,直接就可以運(yùn)行。當(dāng)然其缺點(diǎn)也很明顯玲昧,就是會(huì)使用目標(biāo)程序的體積增大栖茉。
動(dòng)態(tài)庫(kù)
動(dòng)態(tài)庫(kù)即動(dòng)態(tài)鏈接庫(kù)(Windows 下的 .dll,Linux 下的 .so孵延,Mac 下的 .dylib)吕漂。與靜態(tài)庫(kù)相反,動(dòng)態(tài)庫(kù)在編譯時(shí)并不會(huì)被拷貝到目標(biāo)程序中隙袁,目標(biāo)程序中只會(huì)存儲(chǔ)指向動(dòng)態(tài)庫(kù)的引用痰娱。等到程序運(yùn)行時(shí)弃榨,動(dòng)態(tài)庫(kù)才會(huì)被真正加載進(jìn)來(lái)。
動(dòng)態(tài)庫(kù)的優(yōu)點(diǎn)是梨睁,不需要拷貝到目標(biāo)程序中鲸睛,不會(huì)影響目標(biāo)程序的體積,而且同一份庫(kù)可以被多個(gè)程序使用(因?yàn)檫@個(gè)原因坡贺,動(dòng)態(tài)庫(kù)也被稱作共享庫(kù))官辈。同時(shí),編譯時(shí)才載入的特性遍坟,也可以讓我們隨時(shí)對(duì)庫(kù)進(jìn)行替換拳亿,而不需要重新編譯代碼。動(dòng)態(tài)庫(kù)帶來(lái)的問(wèn)題主要是愿伴,動(dòng)態(tài)載入會(huì)帶來(lái)一部分性能損失肺魁,使用動(dòng)態(tài)庫(kù)也會(huì)使得程序依賴于外部環(huán)境。如果環(huán)境缺少動(dòng)態(tài)庫(kù)或者庫(kù)的版本不正確隔节,就會(huì)導(dǎo)致程序無(wú)法運(yùn)行(Linux 下喜聞樂(lè)見(jiàn)的 lib not found 錯(cuò)誤)鹅经。
iOS Framework
除了上面提到的 .a 和 .dylib 之外,Mac OS/iOS 平臺(tái)還可以使用 Framework怎诫。Framework 實(shí)際上是一種打包方式瘾晃,將庫(kù)的二進(jìn)制文件,頭文件和有關(guān)的資源文件打包到一起幻妓,方便管理和分發(fā)蹦误。
在 iOS 8 之前,iOS 平臺(tái)不支持使用動(dòng)態(tài) Framework肉津,開(kāi)發(fā)者可以使用的 Framework 只有蘋(píng)果自家的 UIKit.Framework强胰,F(xiàn)oundation.Framework 等。這種限制可能是出于安全的考慮(見(jiàn)這里的討論)妹沙。換一個(gè)角度講哪廓,因?yàn)?iOS 應(yīng)用都是運(yùn)行在沙盒當(dāng)中,不同的程序之間不能共享代碼初烘,同時(shí)動(dòng)態(tài)下載代碼又是被蘋(píng)果明令禁止的,沒(méi)辦法發(fā)揮出動(dòng)態(tài)庫(kù)的優(yōu)勢(shì)分俯,實(shí)際上動(dòng)態(tài)庫(kù)也就沒(méi)有存在的必要了肾筐。
由于上面提到的限制,開(kāi)發(fā)者想要在 iOS 平臺(tái)共享代碼缸剪,唯一的選擇就是打包成靜態(tài)庫(kù) .a 文件吗铐,同時(shí)附上頭文件(例如微信的SDK)。但是這樣的打包方式不夠方便杏节,使用時(shí)也比較麻煩唬渗,大家還是希望共享代碼都能能像 Framework 一樣典阵,直接扔到工程里就可以用。于是人們想出了各種奇技淫巧去讓 Xcode Build 出 iOS 可以使用的 Framework镊逝,具體做法參考這里和這里壮啊,這種方法產(chǎn)生的 Framework 還有 “偽”(Fake) Framework 和 “真“(Real) Framework 的區(qū)別。
iOS 8/Xcode 6 推出之后撑蒜,iOS 平臺(tái)添加了動(dòng)態(tài)庫(kù)的支持歹啼,同時(shí) Xcode 6 也原生自帶了 Framework 支持(動(dòng)態(tài)和靜態(tài)都可以),上面提到的的奇技淫巧也就沒(méi)有必要了(新的做法參考這里)座菠。為什么 iOS 8 要添加動(dòng)態(tài)庫(kù)的支持狸眼?唯一的理由大概就是 Extension 的出現(xiàn)。Extension 和 App 是兩個(gè)分開(kāi)的可執(zhí)行文件浴滴,同時(shí)需要共享代碼拓萌,這種情況下動(dòng)態(tài)庫(kù)的支持就是必不可少的了。但是這種動(dòng)態(tài) Framework 和系統(tǒng)的 UIKit.Framework 還是有很大區(qū)別升略。系統(tǒng)的 Framework 不需要拷貝到目標(biāo)程序中微王,我們自己做出來(lái)的 Framework 哪怕是動(dòng)態(tài)的,最后也還是要拷貝到 App 中(App 和 Extension 的 Bundle 是共享的)降宅,因此蘋(píng)果又把這種 Framework 稱為 Embedded Framework骂远。
11、數(shù)組去重腰根,查找重復(fù)數(shù)據(jù)激才,如果用for寫(xiě)的算法的時(shí)間復(fù)雜度?
結(jié)合set去重额嘿,使用for嵌套寫(xiě)的算法瘸恼,時(shí)間復(fù)雜度n^2
(1)、無(wú)序去重
set册养,dic
( 2)东帅、有序去重
開(kāi)品新的數(shù)組,for循環(huán) containsobject
12球拦、雙向冒泡法靠闭?最理想的情況的時(shí)間復(fù)雜度與最不理想的情況的時(shí)間復(fù)雜度?
13坎炼、Masonry的設(shè)計(jì)思想愧膀?
簡(jiǎn)化的設(shè)計(jì)模式:工廠類&工廠方法
MASConstraintMaker類就是一個(gè)工廠類,負(fù)責(zé)創(chuàng)建MASConstraint類型的對(duì)象(依賴于MASConstraint接口谣光,而不依賴于具體實(shí)現(xiàn))檩淋。在UIView的View+MASAdditions分類中就是調(diào)用的MASConstraintMaker類中的一些方法。上述我們?cè)谑褂肕asonry給subView添加約束時(shí)萄金,mas_makeConstraints方法中的Block的參數(shù)就是MASConstraintMaker的對(duì)象蟀悦。用戶可以通過(guò)該Block回調(diào)過(guò)來(lái)的MASConstraintMaker對(duì)象給View指定要添加的約束以及該約束的值媚朦。該工廠中的constraints屬性數(shù)組就記錄了該工廠創(chuàng)建的所有MASConstraint對(duì)象。
組合模式
鏈?zhǔn)骄幊?/p>
14日戈、app里有多個(gè)音頻sdk交叉使用询张,其中某一個(gè)突然無(wú)法播放聲音,但獨(dú)立使用時(shí)沒(méi)有問(wèn)題的,如何定位?
avaudioseesion鞋既,搶占主聲道資源,
15半火、多個(gè)sdk如何根據(jù)直播間動(dòng)態(tài)調(diào)配sdk?
使用工廠管理實(shí)例應(yīng)該可以做到
16季俩、二叉樹(shù)是什么钮糖?什么情況下使用?如何做平衡酌住?
二叉樹(shù)是每個(gè)節(jié)點(diǎn)最多有兩個(gè)子樹(shù)的樹(shù)結(jié)構(gòu)店归。通常子樹(shù)被稱作“左子樹(shù)”和“右子樹(shù)”,左子樹(shù)和右子樹(shù)同時(shí)也是二叉樹(shù)酪我。二叉樹(shù)的子樹(shù)有左右之分消痛,并且次序不能任意顛倒。二叉樹(shù)是遞歸定義的都哭,所以一般二叉樹(shù)的相關(guān)題目也都可以使用遞歸的思想來(lái)解決秩伞,當(dāng)然也有一些可以使用非遞歸的思想解決,我下面列出的一些算法有些采用了遞歸欺矫,有些是非遞歸的纱新。
快速搜索,大數(shù)據(jù)插入穆趴,刪除脸爱,
17、封裝sdk要注意哪些事項(xiàng)未妹?
? 確保外部調(diào)用簡(jiǎn)單簿废,且保證有詳細(xì)的頭文件注釋說(shuō)明。
? 確保API編碼規(guī)范络它,保證風(fēng)格統(tǒng)一捏鱼。
? 確保API易擴(kuò)展,可以考慮預(yù)留參數(shù)
? 確保沒(méi)有外部依賴或者依賴要盡可能的少酪耕,以保證公共庫(kù)的純潔(原則上不能有外部依賴)
? 確保易維護(hù),不存在冗余API