Socket:http://www.mamicode.com/info-detail-877996.html
WebView:http://www.reibang.com/p/e6733fd9c069
WKWebView:http://www.reibang.com/p/4fa8c4eb1316
DSBridge:https://github.com/wendux/DSBridge-IOS/blob/master/readme-chs.md
3.線程和進程的區(qū)別场仲?
進程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元栓撞,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性垮斯。
進程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式窗怒。進程有獨立的地址空間姨丈,一個進程崩潰后岸蜗,在保護模式下不會對其它進程產(chǎn)生影響,而線程只是一個進程中的不同執(zhí)行路徑盛霎。線程有自己的堆棧和局部變量赠橙,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉愤炸,所以多進程的程序要比多線程的程序健壯期揪,但在進程切換時,耗費資源較大规个,效率要差一些凤薛。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程诞仓,不能用進程缤苫。
4.堆和棧的區(qū)別?
管理方式:對于棧來講墅拭,是由編譯器自動管理活玲,無需我們手工控制;對于堆來說,釋放工作由程序員控制舒憾,容易產(chǎn)生memory leak镀钓。
申請大小:
棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu)镀迂,是一塊連續(xù)的內(nèi)存的區(qū)域丁溅。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS下探遵,棧的大小是2M(也有的說是1M窟赏,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時箱季,將提示overflow涯穷。因此,能從棧獲得的空間較小藏雏。
堆:堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu)求豫,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的诉稍,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址最疆。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存杯巨。由此可見,堆獲得的空間比較靈活努酸,也比較大服爷。
碎片問題:對于堆來講,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù)获诈,從而造成大量的碎片仍源,使程序效率降低。對于棧來講舔涎,則不會存在這個問題笼踩,因為棧是先進后出的隊列,他們是如此的一一對應(yīng)亡嫌,以至于永遠都不可能有一個內(nèi)存塊從棧中間彈出
分配方式:堆都是動態(tài)分配的嚎于,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配挟冠。靜態(tài)分配是編譯器完成的于购,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配知染,但是棧的動態(tài)分配和堆是不同的肋僧,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。
分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)嫌吠,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址止潘,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高居兆。堆則是C/C++函數(shù)庫提供的覆山,它的機制是很復(fù)雜的。
5.Object-C的內(nèi)存管理泥栖?
當你使用new,alloc和copy方法創(chuàng)建一個對象時,該對象的保留計數(shù)器值為1.當你不再使用該對象時,你要負責向該對象發(fā)送一條release或autorelease消息.這樣,該對象將在使用壽命結(jié)束時被銷毀.
當你通過任何其他方法獲得一個對象時,則假設(shè)該對象的保留計數(shù)器值為1,而且已經(jīng)被設(shè)置為自動釋放,你不需要執(zhí)行任何操作來確保該對象被清理.如果你打算在一段時間內(nèi)擁有該對象,則需要保留它并確保在操作完成時釋放它.
如果你保留了某個對象,你需要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數(shù)相等.
20.iOS程序運行流程
1. 系統(tǒng)調(diào)用app的main函數(shù)
2. main函數(shù)調(diào)用UIApplicationMain.
3. UIApplicationMain創(chuàng)建shared application instance, UIApplication默認的instance.
4. UIApplicationMain讀取Info.plist找到主nib文件, 加載nib簇宽,把shared application instance 設(shè)為nib的owner.
5. 通過nib文件,創(chuàng)建app的獨立UIWindows object.
6. 通過nib吧享,實例化了程序的AppDelegate object.
7. app內(nèi)部啟動結(jié)束魏割,application:didFinishLaunchingWith- Options: 被設(shè)定成 wAppDelegate instance.
8. AppDelegate向UIWindow instance發(fā)makeKeyAndVisible消息, app界面展示給用戶. app準備好接收用戶的操作指令.
還有超級經(jīng)典面試題,無答案钢颂!
1.內(nèi)存管理的方式有哪些钞它?
手動管理 ARC GC
2.怎樣實現(xiàn)一個 singleton的類.給出思路
3.什么是序列化或者Acrchiving,可以用來做什么,怎樣與copy結(jié)合,原理是什么?.
4.在iphone上有兩件事情要做,請問是在一個線程里按順序做效率高還是兩個線程里做效率高?為什么殊鞭?
5.runloop是什么遭垛?在主線程中的某個函數(shù)里調(diào)用了異步函數(shù),怎么樣block當前線程,且還能響應(yīng)當前線程的timer事件操灿,touch事件等.
6.ios平臺怎么做數(shù)據(jù)的持久化?coredata和sqlite有無必然聯(lián)系锯仪?coredata是一個關(guān)系型數(shù)據(jù)庫嗎?
7.闡述一個nil對象從interface bulider產(chǎn)生趾盐,到載入程序運行空間庶喜,最后被釋放時所經(jīng)歷的生命周期.
8.notification是同步還是異步? kvo是同步還是異步?
9.notification是全進程空間的通知嗎救鲤?kvo呢久窟?
10.kvc是什么?kvo是什么?有什么特性?
11.響應(yīng)者鏈是什么本缠?
12.unix上進程怎么通信斥扛?
13.timer的間隔周期準嗎?為什么搓茬?怎樣實現(xiàn)一個精準的timer?
14.UIscrollVew用到了什么設(shè)計模式犹赖?還能再foundation庫中找到類似的嗎?
15.如果要開發(fā)一個類似eclipse的軟件卷仑,支持插件結(jié)構(gòu)峻村。且開放給第三方開發(fā)。你會怎樣去設(shè)計它锡凝?(大概思路)
16.C和obj-c 如何混用粘昨?
17.以下每行代碼執(zhí)行后,person對象的retain count分別是多少?Person *person = [[Person alloc] init]; // count 1?[person retain]; // count 2?[person release]; //count 1?[person release]; //retain count = 1;
18.ViewController 的 didReceiveMemoryWarning 是在什么時候被調(diào)用的?
19.內(nèi)存出現(xiàn)警告時张肾。
20.ios9新特性有那些芭析?
美團一面
如何讓一個label靠左,一個label靠右吞瞪,然后右邊的label能夠完全顯示
兩個label全部使用自動布局馁启,都不舍得固定的寬度,先設(shè)置左邊的label文字并sizeToFit芍秆,然后再設(shè)置右邊的label文字并sizeToFit
算法奇數(shù)排在前面惯疙,偶數(shù)排在后面
采用倆個指針,分別指向第一個位置妖啥,和最后一個位置霉颠,當前面的第一個指針遇到了偶數(shù),并且后面一個指針遇到了奇數(shù)荆虱,那么就把這倆個指針指向的位置進行交換數(shù)據(jù)蒿偎。
智力題,一個騎手送餐怀读,ABCD商店诉位,送給abcd四個人
kvo的實現(xiàn)原理
KVO 是 Objective-C 對觀察者模式(Observer Pattern)的實現(xiàn)。也是 Cocoa Binding 的基礎(chǔ)菜枷。當被觀察對象的某個屬性發(fā)生更改時不从,觀察者對象會獲得通知。
KVO是基于runtime機制實現(xiàn)的
當某個類的屬性對象第一次被觀察時犁跪,系統(tǒng)就會在運行期動態(tài)地創(chuàng)建該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter 方法歹袁。派生類在被重寫的setter方法內(nèi)實現(xiàn)真正的通知機制
如果原類為Person坷衍,那么生成的派生類名為NSKVONotifying_Person
每個類對象中都有一個isa指針指向當前類,當一個類對象的第一次被觀察条舔,那么系統(tǒng)會偷偷將isa指針指向動態(tài)生成的派生類枫耳,從而在給被監(jiān)控屬性賦值時執(zhí)行的是派生類的setter方法
鍵值觀察通知依賴于NSObject 的兩個方法:willChangeValueForKey:和didChangevlueForKey:;在一個被觀察屬性發(fā)生改變之前孟抗,willChangeValueForKey:一定會被調(diào)用迁杨,這就 會記錄舊的值。而當改變發(fā)生后凄硼,didChangeValueForKey:會被調(diào)用铅协,繼而observeValueForKey:ofObject:change:context:也會被調(diào)用。
補充:KVO的這套實現(xiàn)機制中蘋果還偷偷重寫了class方法摊沉,讓我們誤認為還是使用的當前類狐史,從而達到隱藏生成的派生類
消息調(diào)用的過程
調(diào)用方法分為調(diào)用實例方法和調(diào)用類方法,在結(jié)構(gòu)體我們可以看到第一個就是一個 isa 指針,會指向類對象或者元類。
每個實例對象有個isa的指針,他指向?qū)ο蟮念?而類里也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表骏全。當類方法被調(diào)用時,先會從元類本身查找類方法的實現(xiàn),如果沒有,元類會向他父類查找該方法苍柏。同時注意的是:元類(meteClass)也是類,它也是對象。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass)姜贡。根元類的isa指針指向本身,這樣形成了一個封閉的內(nèi)循環(huán)试吁。?
通過isa,就可以不斷往上方去回溯自己的父類等,而方法的調(diào)用也利用了這個過程:
方法調(diào)用的過程1.在對象自己緩存的方法列表中去找要調(diào)用的方法,找到了就直接執(zhí)行其實現(xiàn)。2.緩存里沒找到,就去上面說的它的方法列表里找,找到了就執(zhí)行其實現(xiàn)楼咳。3.還沒找到,說明這個類自己沒有了,就會通過isa去向其父類里執(zhí)行1熄捍、2。4.如果找到了根類還沒找到,那么就是沒有了,會轉(zhuǎn)向一個攔截調(diào)用的方法,我們可以自己在攔截調(diào)用方法里面做一些處理爬橡。5.如果沒有在攔截調(diào)用里做處理,那么就會報錯崩潰治唤。?
以上就是方法調(diào)用的過程。我們可以看到的是,所謂重寫父類方法,并不是抹除了父類方法,父類的方法還是存在的,只是我們在子類里面找到了就不會再去父類里找了,是這個層面的“覆蓋”糙申。而我們熟悉的 super 調(diào)用父類的方法實現(xiàn),就是告知要去調(diào)用父類實現(xiàn)的標識宾添。
get和post的區(qū)別
get參數(shù)通過url傳遞,post放在request body中柜裸。
get請求在url中傳遞的參數(shù)是有長度限制的缕陕,而post沒有。
get比post更不安全疙挺,因為參數(shù)直接暴露在url中扛邑,所以不能用來傳遞敏感信息。
get請求只能進行url編碼铐然,而post支持多種編碼方式
get請求會瀏覽器主動cache蔬崩,而post支持多種編碼方式。
get請求參數(shù)會被完整保留在瀏覽歷史記錄里搀暑,而post中的參數(shù)不會被保留沥阳。
GET和POST本質(zhì)上就是TCP鏈接,并無差別自点。但是由于HTTP的規(guī)定和瀏覽器/服務(wù)器的限制桐罕,導(dǎo)致他們在應(yīng)用過程中體現(xiàn)出一些不同。
GET產(chǎn)生一個TCP數(shù)據(jù)包桂敛;POST產(chǎn)生兩個TCP數(shù)據(jù)包功炮。
長的說:
對于GET方式的請求,瀏覽器會把http header和data一并發(fā)送出去术唬,服務(wù)器響應(yīng)200(返回數(shù)據(jù))薪伏;
而對于POST,瀏覽器先發(fā)送header粗仓,服務(wù)器響應(yīng)100 continue毅该,瀏覽器再發(fā)送data博秫,服務(wù)器響應(yīng)200 ok(返回數(shù)據(jù))。
http有哪些部分
http協(xié)議的請求又包含一下內(nèi)容
?1眶掌,請求方法-URL-協(xié)議/版本
?2挡育,請求頭
?3,請求正文
http響應(yīng)的請求又包含一下內(nèi)容
?1朴爬,狀態(tài)行
?2即寒,響應(yīng)頭
?3,響應(yīng)正文
在接受和解釋請求的消息之后召噩,服務(wù)器會返回一個http的響應(yīng)消息
tcp和udp的區(qū)別
1母赵、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2具滴、TCP提供可靠的服務(wù)凹嘲。也就是說,通過TCP連接傳送的數(shù)據(jù)构韵,無差錯周蹭,不丟失,不重復(fù)疲恢,且按序到達;UDP盡最大努力交付凶朗,即不保 ? 證可靠交付
3、TCP面向字節(jié)流显拳,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報文的
UDP沒有擁塞控制棚愤,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機的發(fā)送速率降低(對實時應(yīng)用很有用,如IP電話杂数,實時視頻會議等)
4宛畦、每一條TCP連接只能是點到點的;UDP支持一對一,一對多揍移,多對一和多對多的交互通信
5刃永、TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個字節(jié)6羊精、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
七層模型
1囚玫、應(yīng)用層
網(wǎng)絡(luò)服務(wù)與最終用戶的一個接口喧锦。
協(xié)議有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
2、表示層
數(shù)據(jù)的表示抓督、安全燃少、壓縮。(在五層模型里面已經(jīng)合并到了應(yīng)用層)
格式有铃在,JPEG阵具、ASCll碍遍、DECOIC、加密格式等
3阳液、會話層
建立怕敬、管理、終止會話帘皿。(在五層模型里面已經(jīng)合并到了應(yīng)用層)
對應(yīng)主機進程东跪,指本地主機與遠程主機正在進行的會話
4、傳輸層
定義傳輸數(shù)據(jù)的協(xié)議端口號鹰溜,以及流控和差錯校驗虽填。
協(xié)議有:TCP UDP,數(shù)據(jù)包一旦離開網(wǎng)卡即進入網(wǎng)絡(luò)傳輸層
5曹动、網(wǎng)絡(luò)層
進行邏輯地址尋址斋日,實現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇。
協(xié)議有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
6墓陈、數(shù)據(jù)鏈路層
建立邏輯連接恶守、進行硬件地址尋址、差錯校驗 [2]? 等功能跛蛋。(由底層網(wǎng)絡(luò)定義協(xié)議)
將比特組合成字節(jié)進而組合成幀熬的,用MAC地址訪問介質(zhì)浙炼,錯誤發(fā)現(xiàn)但不能糾正发笔。
7、物理層
建立尿背、維護理逊、斷開物理連接橡伞。(由底層網(wǎng)絡(luò)定義協(xié)議)
TCP/IP層級模型結(jié)構(gòu),應(yīng)用層之間的協(xié)議通過逐級調(diào)用傳輸層(Transport layer)晋被、網(wǎng)絡(luò)層(Network Layer)和物理數(shù)據(jù)鏈路層(Physical Data Link)而可以實現(xiàn)應(yīng)用層的應(yīng)用程序通信互聯(lián)兑徘。
應(yīng)用層需要關(guān)心應(yīng)用程序的邏輯細節(jié),而不是數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸活動羡洛。應(yīng)用層其下三層則處理真正的通信細節(jié)挂脑。在 Internet 整個發(fā)展過程中的所有思想和著重點都以一種稱為 RFC(Request For Comments)的文檔格式存在。針對每一種特定的 TCP/IP應(yīng)用欲侮,有相應(yīng)的 RFC [3]? 文檔崭闲。
一些典型的 TCP/IP 應(yīng)用有 FTP、Telnet威蕉、SMTP刁俭、SNTP、REXEC韧涨、TFTP牍戚、LPD侮繁、SNMP、NFS如孝、INETD 等宪哩。RFC 使一些基本相同的 TCP/IP 應(yīng)用程序?qū)崿F(xiàn)了標準化,從而使得不同廠家開發(fā)的應(yīng)用程序可以互相通信
美團二面
講一講響應(yīng)鏈
如何通過一個view查找它所在的viewController
如何擴大view的響應(yīng)范圍
微信分享大圖如何實現(xiàn)暑竟,從進程的角度
進程間的通信方式斋射,并舉例
兩個進程分別指向同一個地址空間并初始化一個值,分別輸出是什么
算法但荤,判斷一個字符串是否所有的大寫字母都在小寫字母前面
修改podfile文件后罗岖,怎么用git diff顯示出修改后版本和當前版本的不同,讓我來設(shè)計
程序執(zhí)行的過程
如果想要刪除自己的一段代碼腹躁,如何刪除(在程序執(zhí)行的過程中刪除)
用過腳本編程嗎
了解前后端嗎
阿里一面
屬性的關(guān)鍵字
http://www.reibang.com/p/8b3cf2187255
淺拷貝和深拷貝的區(qū)別
http://www.reibang.com/p/5df570135ad2
Block的循環(huán)引用桑包、如何解決、原理
https://blog.csdn.net/Jason_Wang_1314/article/details/44655957
三種Block
http://www.reibang.com/p/6d6fd717390e
Block和delegate的比較
https://blog.csdn.net/vbirdbest/article/details/51878995
kvo的實現(xiàn)原理
Autorelease pool的實現(xiàn)原理
消息轉(zhuǎn)發(fā)機制
線程死鎖的四個條件
https://blog.csdn.net/rabbit_in_android/article/details/50530960
進程和線程的區(qū)別
https://blog.csdn.net/zhou753099943/article/details/51771220
持久化
http://www.reibang.com/p/aa78b21296ea
事務(wù)的特征
事務(wù)(Transaction)是并發(fā)控制的單位纺非,是用戶定義的一個操作序列哑了。這些操作要么都做,要么都不做烧颖,是一個不可分割的工作單位弱左。通過事務(wù),SQL Server能將邏輯相關(guān)的一組操作綁定在一起炕淮,以便服務(wù)器保持數(shù)據(jù)的完整性拆火。事務(wù)通常是以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結(jié)束涂圆。
COMMIT
表示提交们镜,即提交事務(wù)的所有操作。具體地說就是將事務(wù)中所有對數(shù)據(jù)庫的更新寫回到磁盤上的物理數(shù)據(jù)庫中去润歉,事務(wù)正常結(jié)束模狭。
ROLLBACK
表示回滾,即在事務(wù)運行的過程中發(fā)生了某種故障踩衩,事務(wù)不能繼續(xù)進行嚼鹉,系統(tǒng)將事務(wù)中對數(shù)據(jù)庫的所有以完成的操作全部撤消,滾回到事務(wù)開始的狀態(tài)驱富。事務(wù)的特性(ACID特性)
A:原子性(Atomicity)
事務(wù)是數(shù)據(jù)庫的邏輯工作單位锚赤,事務(wù)中包括的諸操作要么全做,要么全不做萌朱。
B:一致性(Consistency)
事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。一致性與原子性是密切相關(guān)的策菜。
C:隔離性(Isolation)
一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾晶疼。
D:持續(xù)性/永久性(Durability)
一個事務(wù)一旦提交酒贬,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。
中途還討論了massonery的約束應(yīng)該寫在哪里翠霍,我說應(yīng)該寫在layoutSubViews锭吨,他說會調(diào)用多次,然后爭論了一會兒
阿里二面
介紹項目
性能優(yōu)化
https://blog.csdn.net/sinat_20940101/article/details/51906407
YYModel和AF源碼
如何自己設(shè)計json轉(zhuǎn)model
架構(gòu)
迷之算法題
阿里三面
主要問了項目的一些東西 和給一些場景問我如何實現(xiàn)
自我介紹 介紹一些項目難點
主線程是相對于什么而言的
一張圖片的內(nèi)存占用大小是由什么決定的
索引的作用
索引的優(yōu)缺點
在數(shù)組中找最小的k個數(shù)
淘寶下拉加載更多如何優(yōu)化
淘寶頁面發(fā)送HTTP請求的過程
介紹一下MVVM
知道哪些設(shè)計模式
頭條一面
MVC的一些缺點
https://blog.csdn.net/sinat_36668474/article/details/53581583
講一講其它架構(gòu)
你知道哪些編碼方式
https://blog.csdn.net/shaobo8910/article/details/51397631
算法字符串翻轉(zhuǎn)
HTTPS
多線程的方式和它們的區(qū)別
隊列和線程的關(guān)系
一道線程安全的題
有哪些鎖
屬性的關(guān)鍵字
assign可以用于OC對象嗎
copy和strong的區(qū)別
weak如何實現(xiàn)自動賦nil
為什么不可變對象要用copy
assing可以使用在對象中嗎
頭條二面
Pod update和pod install的區(qū)別
layoutIfNeeded和setNeedsLayout的區(qū)別
抓包工具抓取HTTPS的原理
isEquel和hash的關(guān)系
SD的源碼
bitmap的結(jié)構(gòu)
可變數(shù)組的實現(xiàn)原理
如何hook一個對象的方法寒匙,而不影響其它對象
如何避免if else
自旋鎖和互斥鎖的區(qū)別
頭條三面
介紹項目零如,主要介紹自己強項一點的地方
數(shù)組cop后里面的元素會復(fù)制一份新的嗎
數(shù)組的淺拷貝與深拷貝
TCP為什么是三次握手和四次揮手
http://www.reibang.com/p/bbb6261cb13e
騰訊一面
介紹項目的網(wǎng)絡(luò)層
為什么要使用HTTP?锄弱?考蕾?為什么不直接用TCP
如何保證HTTP傳輸?shù)竭_
HTTP頭部有哪些內(nèi)容
講一講擁塞控制
MVVM如何實現(xiàn)綁定
block和通知的區(qū)別,分別適用什么場景
算法会宪。連續(xù)問了好幾個肖卧,都是數(shù)組,層層遞進的掸鹅,但是我忘了塞帐,只記得最后是找出數(shù)組中重復(fù)的數(shù)字
進程和線程的區(qū)別
程序在運行時操作系統(tǒng)除了分配內(nèi)存空間還有什么
進程間通信的方式
如何檢測應(yīng)用是否卡頓
好像沒多少問題了,記不太清巍沙,然后他說完了葵姥,我感覺好快,以為要掛了句携,就強行講了些runloop和性能優(yōu)化的東西榔幸,然后他說好了,你和下一輪面試官再說吧
騰訊二面
OC中對象的結(jié)構(gòu)
多態(tài)
http://www.reibang.com/p/26fab97c51ba
Ping是什么協(xié)議
http://www.reibang.com/p/c717fa5696fc
知道MTU嗎
TCP頭部多長务甥,IP呢
線程同步的方式
iOS中有哪些鎖
MVC和MVVM的區(qū)別
了解哪些設(shè)計模式
存一個通訊錄牡辽,包括增刪改查,用什么數(shù)據(jù)結(jié)構(gòu)
看過哪些源碼敞临,講講思路
兩個鏈表找第一個相同結(jié)點
字符串旋轉(zhuǎn)
找鏈表的倒數(shù)第k個結(jié)點
把一個鏈表比某個值大的放在左邊态辛,比它小的放在右邊
二叉樹的中序遍歷,非遞歸
百度一面
進程和線程的區(qū)別
一個進程有哪些區(qū)
擁塞控制
進程間通信的方式
七層模型
TCP和UDP的區(qū)別
傳輸層和網(wǎng)絡(luò)層分別是做什么的
UDP可以實現(xiàn)一對多挺尿?奏黑?
算法 求數(shù)組的最長子數(shù)組
Http2.0如1.x的區(qū)別
百度二面
發(fā)送一個HTTP請求的過程
TCP是如何保證可靠的
內(nèi)核態(tài)和用戶態(tài)的區(qū)別
在一個10G的數(shù)據(jù)里面找出最大的100個數(shù)
講一下我最滿意的一個項目
然后講了一下網(wǎng)絡(luò)造成卡頓的原因
百度三面
全是問得iOS方面的問題,問得真的很細编矾,需要基礎(chǔ)很扎實熟史,對各個機制真的足夠理解,不然確實有點難回答窄俏。我只列舉一下大概方向蹂匹,這些東西也是iOS開發(fā)必須掌握的基礎(chǔ)吧
屬性的關(guān)鍵字方面的
內(nèi)存管理方面的
多線程
各種隊列
線程鎖
MVVM
1.為什么說Objective-C是一門動態(tài)的語言?
1.object-c類的類型和數(shù)據(jù)變量的類型都是在運行是確定的凹蜈,而不是在編譯時確定限寞。例如:多態(tài)特性忍啸,我們可以使用父類指針來指向子類對象,并且可以用來調(diào)用子類的方法履植。運行時(runtime)特性,我們可以動態(tài)的添加方法计雌,或者替換方法。
2.講一下MVC和MVVM玫霎,MVP凿滤?
MVC:簡單來說就是,邏輯庶近、試圖翁脆、數(shù)據(jù)進行分層,實現(xiàn)解耦拦盹。
MVVM:是Model-View-ViewMode模式的簡稱鹃祖。由視圖(View)、視圖模型(ViewModel)普舆、模型(Model)三部分組成.比MVC更加釋放控制器臃腫恬口,將一部分邏輯(耗時,公共方法沼侣,網(wǎng)絡(luò)請求等)和數(shù)據(jù)的處理等操作從控制器里面搬運到ViewModel中
MVVM的特點:
低耦合祖能。View可以獨立于Model變化和修改,一個ViewModel可以綁定到不同的View上蛾洛,當View變化的時候Model可以不變养铸,當Model變化的時候View也可以不變。
可重用性轧膘〕可以把一些視圖的邏輯放在ViewModel里面,讓很多View重用這段視圖邏輯谎碍。
獨立開發(fā)鳞滨。開發(fā)人員可以專注與業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel)。設(shè)計人員可以專注于界面(View)的設(shè)計蟆淀。
可測試性拯啦。可以針對ViewModel來對界面(View)進行測試
MVP:本小編沒有接觸熔任,希望可以得到大家的幫助褒链。可以在下面留言疑苔。
3.為什么代理要用weak甫匹?代理的delegate和dataSource有什么區(qū)別?block和代理的區(qū)別?
代理是使用weak來修飾的。1.使用weak是為了避免循環(huán)引用兵迅。2.當使用weak修飾的屬性哀墓,當對象釋放的時候,系統(tǒng)會對屬性賦值nil,object-c有個特性就是對nil對象發(fā)送消息也就是調(diào)用方法喷兼,不會cash。
delegate:傳遞的是事件(even)后雷,代理可以讓A對象通知B對象季惯,我(A)發(fā)生的變化,前提B遵循了A的代理臀突,并且實現(xiàn)了A的代理方法勉抓。
dataSource: 傳遞的是數(shù)據(jù)。如果A對象聲明了數(shù)據(jù)源候学,當我們創(chuàng)建A對象的時候藕筋,我們就該實現(xiàn)數(shù)據(jù)源,來告訴A梳码,他所需要的一些數(shù)據(jù)隐圾。例如:tableView數(shù)據(jù)源方法,需要告訴它掰茶,我要實現(xiàn)幾組cell暇藏,每組cell多少行cell,實現(xiàn)的cell什么樣式濒蒋,什么內(nèi)容
同樣delegate和dataSource,都是可以使用require和optional來修飾的盐碱。
代理和Block的區(qū)別
相同點:代理和Block大多是我們都可以用來做倒序傳值的。我們都得注意避免循環(huán)引用沪伙。不然我們?nèi)ナ褂么磉€是Block的時候瓮顽,都需要判斷它們是否實現(xiàn)
不同點:代理使用weak修飾,代理必須先聲明方法围橡。當我們調(diào)用代理的時候要判斷是否已經(jīng)實現(xiàn)暖混。
block:使用的是copy來修飾,block保存的是一段代碼某饰,其實也就是一個函數(shù)儒恋。并且可以自動捕捉自動變量,如果想修改此自動變量黔漂,還必須使用__block修飾诫尽。
4.屬性的實質(zhì)是什么?包括哪幾個部分炬守?屬性默認的關(guān)鍵字都有哪些牧嫉?@dynamic關(guān)鍵字和@synthesize關(guān)鍵字是用來做什么的?
屬性是描述類的特征,也就是具備什么特性酣藻。三個部分曹洽,帶下劃線的成員變量,get辽剧、setter方法送淆。
默認關(guān)鍵字:readwrite,assign, atomic; -- 是針對基本類型(NSInteger, BOOL, NSUInteger, int, 等)
但是針對引用類型, 默認:strong, readwrite, atomic (例如:NSString, NSArray, NSDictory等)
@dynamic :修飾的屬性怕轿,其getter和setter方法編譯器是不會自動幫你生成偷崩。必須自己是實現(xiàn)的。
@synthesize:修飾的屬性撞羽,其getter和setter方法編譯器是會自動幫你生成阐斜,不必自己實現(xiàn)。且指定與屬性相對應(yīng)的成員變量诀紊。
5.屬性的默認關(guān)鍵字是什么谒出?
默認關(guān)鍵字,基本數(shù)據(jù): atomic,readwrite,assign
普通的 OC 對象: atomic,readwrite,strong
6.NSString為什么要用copy關(guān)鍵字邻奠,如果用strong會有什么問題笤喳?(注意:這里沒有說用strong就一定不行。使用copy和strong是看情況而定的
眾所周知碌宴,我們知道莉测,可變類型(NSMutableArray,NSMutableString等)是不可邊類型(NSString,NSArray等)的子類,因為多態(tài)的原因唧喉,我們可以使用不可邊類型去接受可變類型捣卤。
1.當我們使用strong修飾A不可邊類型的時候,并且使用B可變類型給A賦值八孝,再去修改可變類型B值的時候董朝,A所指向的值也會發(fā)生改變。引文strong只是讓創(chuàng)建的對象引用計數(shù)器+1干跛,并返回當前對象的內(nèi)容地址子姜,當我們修改B指向的內(nèi)容的時候,A指向的內(nèi)容也同樣發(fā)生了改變楼入,因為他們指向的內(nèi)存地址是相同的,是一份內(nèi)容哥捕。
2.當我們使用copy修飾A不可邊類型的時候,并且使用B可變類型給A賦值嘉熊,再去修改可變類型B值的時候遥赚,A所指向的值不會發(fā)生改變。因為當時用copy的修飾的時候阐肤,會拷貝一份內(nèi)容出來凫佛,并且返回指針給A讲坎,當我們修改B指向的內(nèi)容的時候,A指向的內(nèi)容是沒有發(fā)生改變的愧薛。因為A指向的內(nèi)存地址和B指向的內(nèi)存地址是不相同的晨炕,是兩份內(nèi)容
3.copy修飾不可邊類型(NSString,NSArray等)的時候,且使用不可邊類型進行賦值毫炉,表示淺拷貝瓮栗,只拷貝一份指針,和strong修飾一樣瞄勾,當修飾的是可變類型(NSMutableArray,NSMutableString等)的時候遵馆,且使用可邊類型進行賦值,表示深拷貝丰榴,直接拷貝新一份內(nèi)容,到內(nèi)存中秆撮。表示兩份內(nèi)容四濒。
image.png
7.如何令自己所寫的對象具有拷貝功能?
如果想讓自己的類具備copy方法,并返回不可邊類型职辨,必須遵循nscopying協(xié)議盗蟆,并且實現(xiàn)
- (id)copyWithZone:(NSZone *)zone
如果讓自己的類具備mutableCopy方法,并且放回可變類型舒裤,必須遵守NSMutableCopying喳资,并實現(xiàn)- (id)mutableCopyWithZone:(nullable NSZone *)zone
注意:再此說的copy對應(yīng)不可邊類型和mutableCopy對應(yīng)不可邊類型方法,都是遵從系統(tǒng)規(guī)則而已腾供。如果你想實現(xiàn)自己的規(guī)則仆邓,也是可以的。
8.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什么區(qū)別伴鳖?如果是集合是內(nèi)容復(fù)制的話节值,集合里面的元素也是內(nèi)容復(fù)制么?
可變使用copy表示深拷貝榜聂,不可變集合類使用copy的時候是淺拷貝搞疗。
可變集合類、不可邊類型使用mutablecopy表示深拷貝
當是淺拷貝的時候须肆,容器的內(nèi)容是沒有復(fù)制的匿乃。如果是深拷貝的話,容器的內(nèi)容都會收到一條copy消息豌汇,拷貝出新的內(nèi)容幢炸,從新組成新的容器返回。
9.為什么IBOutlet修飾的UIView也適用weak關(guān)鍵字拒贱?
在xib或者Sb拖控件時阳懂,其實控件就加載到了父控件的subviews數(shù)組里面,進行了強引用,即使使用了weak岩调,也不造成對象的釋放巷燥。
10.nonatomic和atomic的區(qū)別?atomic是絕對的線程安全么号枕?為什么缰揪?如果不是,那應(yīng)該如何實現(xiàn)葱淳?
nonatomic:表示非原子钝腺,不安全,但是效率高赞厕。
atomic:表示原子行艳狐,安全,但是效率低皿桑。
atomic:不能絕對保證線程的安全毫目,當多線程同時訪問的時候,會造成線程不安全诲侮《婆埃可以使用線程鎖來保證線程的安全。
11.UICollectionView自定義layout如何實現(xiàn)沟绪?
實現(xiàn)一個自定義layout的常規(guī)做法是繼承UICollectionViewLayout類刮便,然后重載下列方法:
-(CGSize)collectionViewContentSize返回collectionView的內(nèi)容的尺寸-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect返回rect中的所有的元素的布局屬性返回的是包含UICollectionViewLayoutAttributes的NSArrayUICollectionViewLayoutAttributes可以是cell,追加視圖或裝飾視? ? 圖的信息绽慈,通過不同的UICollectionViewLayoutAttributes初始化方法可以得到不同類型的UICollectionViewLayoutAttributes:? layoutAttributesForCellWithIndexPath:? layoutAttributesForSupplementaryViewOfKind:withIndexPath:layoutAttributesForDecorationViewOfKind:withIndexPath:? -(UICollectionViewLayoutAttributes)layoutAttributesForItemAtIndexPath:(NSIndexPath)indexPath返回對應(yīng)于indexPath的位置的cell的布局屬性-(UICollectionViewLayoutAttributes)layoutAttributesForSupplementaryViewOfKind:(NSString)kind atIndexPath:(NSIndexPath*)indexPath返回對應(yīng)于indexPath的位置的追加視圖的布局屬性恨旱,如果沒有追加視圖可不重載-(UICollectionViewLayoutAttributes* )layoutAttributesForDecorationViewOfKind:(NSString)decorationViewKind atIndexPath:(NSIndexPath)indexPath返回對應(yīng)于indexPath的位置的裝飾視圖的布局屬性,如果沒有裝飾視圖可不重載-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds當邊界發(fā)生改變時坝疼,是否應(yīng)該刷新布局窖杀。如果YES則在邊界變化(一般是scroll到其他地方)時,將重新計算需要的布局信息裙士。
12.用StoryBoard開發(fā)界面有什么弊端入客?如何避免?
使用簡單邏輯頁面的跳轉(zhuǎn)是可以使用sb的腿椎,開發(fā)比較塊桌硫。
但是SB對于邏輯項目比較復(fù)雜的時候,開發(fā)起來比較慢啃炸。不適合多人合作開發(fā)铆隘;也不利于版本的梗系和后期的維護。使用sb在項目變異編譯的時候南用,也都會直接加載到內(nèi)存中膀钠,造成內(nèi)存的浪費掏湾。
可以使用xib來代替,編輯復(fù)雜邏輯界面時候可以使用純碼編寫肿嘲。
13.進程和線程的區(qū)別融击?同步異步的區(qū)別?并行和并發(fā)的區(qū)別雳窟?
進程:是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位.
線程:是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
同步:阻塞當前線程操作尊浪,不能開辟線程。
異步:不阻礙線程繼續(xù)操作封救,可以開辟線程來執(zhí)行任務(wù)拇涤。
并發(fā):當有多個線程在操作時,如果系統(tǒng)只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間 段分配給各個線程執(zhí)行誉结,在一個時間段的線程代碼運行時鹅士,其它線程處于掛起狀。.這種方式我們稱之為并發(fā)(Concurrent)惩坑。
并行:當系統(tǒng)有一個以上CPU時,則線程的操作有可能非并發(fā)掉盅。當一個CPU執(zhí)行一個線程時,另一個CPU可以執(zhí)行另一個線程旭贬,兩個線程互不搶占CPU資源,可以同時進行搪泳,這種方式我們稱之為并行(Parallel)稀轨。
區(qū)別:并發(fā)和并行是即相似又有區(qū)別的兩個概念,并行是指兩個或者多個事件在同一時刻發(fā)生岸军;而并發(fā)是指兩個或多個事件在同一時間間隔內(nèi)發(fā)生奋刽。在多道程序環(huán)境下,并發(fā)性是指在一段時間內(nèi)宏觀上有多個程序在同時運行艰赞,但在單處理機系統(tǒng)中佣谐,每一時刻卻僅能有一道程序執(zhí)行,故微觀上這些程序只能是分時地交替執(zhí)行方妖。倘若在計算機系統(tǒng)中有多個處理機狭魂,則這些可以并發(fā)執(zhí)行的程序便可被分配到多個處理機上,實現(xiàn)并行執(zhí)行党觅,即利用每個處理機來處理一個可并發(fā)執(zhí)行的程序雌澄,這樣,多個程序便可以同時執(zhí)行杯瞻。
14.線程間通信镐牺?
當使用dispath-async函數(shù)開辟線程執(zhí)行任務(wù)的完成時,我們需要使用dispatch_async(dispatch_get_main_queue(), ^{? });函數(shù)會到主線程內(nèi)刷新UI魁莉。并完成通信
15.GCD的一些常用的函數(shù)睬涧?(group募胃,barrier,信號量畦浓,線程同步)
我們使用隊列組來開辟線程時痹束,隊列組中的隊列任務(wù)是并發(fā),當所有的隊列組中的所有任務(wù)完成時候宅粥,才可以調(diào)用隊列組完成任務(wù)参袱。
/**創(chuàng)建自己的隊列*/dispatch_queue_tdispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT);/**創(chuàng)建一個隊列組*/dispatch_group_t dispatchGroup = dispatch_group_create();/**將隊列任務(wù)添加到隊列組中*/dispatch_group_async(dispatchGroup, dispatchQueue, ^(){NSLog(@"dispatch-1");});/**將隊列任務(wù)添加到隊列組中*/dispatch_group_async(dispatchGroup, dispatchQueue, ^(){NSLog(@"dspatch-2");});/**隊列組完成調(diào)用函數(shù)*/dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){NSLog(@"end");})
barrier:表示柵欄,當在并發(fā)隊列里面使用柵欄時候秽梅,柵欄之前的并發(fā)任務(wù)開始并發(fā)執(zhí)行抹蚀,執(zhí)行完畢后,執(zhí)行柵欄內(nèi)的任務(wù)企垦,等柵欄任務(wù)執(zhí)行完畢后环壤,再并發(fā)執(zhí)行柵欄后的任務(wù)谱净。
dispatch_queue_tconcurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);dispatch_async(concurrentQueue, ^(){NSLog(@"dispatch-1");});dispatch_async(concurrentQueue, ^(){NSLog(@"dispatch-2");});dispatch_barrier_async(concurrentQueue, ^(){NSLog(@"dispatch-barrier"); });dispatch_async(concurrentQueue, ^(){NSLog(@"dispatch-3");});dispatch_async(concurrentQueue, ^(){NSLog(@"dispatch-4");});
信號量:Semaphore是通過‘計數(shù)’的方式來標識線程是否是等待或繼續(xù)執(zhí)行的逃片。信號量
dispatch_semaphore_create(int)// 創(chuàng)建一個信號,并初始化信號的計數(shù)大小/* 等待信號未荒,并且判斷信號量荧降,如果信號量計數(shù)大于等于你創(chuàng)建時候的信號量的計數(shù)接箫,就可以通過,繼續(xù)執(zhí)行朵诫,并且將你傳入的信號計數(shù)減1辛友,
* 如果傳入的信號計數(shù)小于你創(chuàng)建的計數(shù),就表示等待剪返,等待信號計數(shù)的變化
*? 如果等待的時間超過你傳入的時間废累,也會繼續(xù)下面操作
*? 第一個參數(shù):semaphore 表示信號量
*? 第二個參數(shù):表示等待的時間
*? ? 返回int 如果傳入的信號計數(shù)大于等于你創(chuàng)建信號的計數(shù)時候,返回0.? 反之脱盲,返回的不等于0
*/intresult = dispatch_semaphore_wait(dispatch_semaphore_tsemaphore,time outTime);// 表示等待邑滨,也是阻礙線程// 表示將信號技術(shù)+1dispatch_semaphore_signl(dispatch_semaphore_tsemaphore);
實現(xiàn)線程的同步的方法:串行隊列,分組钱反,信號量掖看。也是可以使用并發(fā)隊列。
//加入隊列dispatch_async(concurrentQueue, ^{//1.先去網(wǎng)上下載圖片dispatch_sync(concurrentQueue, ^{? ? ? ? ? });//2.在主線程展示到界面里dispatch_sync(dispatch_get_main_queue(), ^{? ? });});
16.如何使用隊列來避免資源搶奪面哥?
當我們使用多線程來訪問同一個數(shù)據(jù)的時候乙各,就有可能造成數(shù)據(jù)的不準確性。這個時候我么可以使用線程鎖的來來綁定幢竹。也是可以使用串行隊列來完成耳峦。如:fmdb就是使用FMDatabaseQueue,來解決多線程搶奪資源焕毫。
17.數(shù)據(jù)持久化的幾個方案(fmdb用沒用過)
持久化方案:
plist,存儲字典蹲坷,數(shù)組比較好用
preference:偏好設(shè)置驶乾,實質(zhì)也是plist
NSKeyedArchiver:歸檔,可以存儲對象
sqlite:數(shù)據(jù)庫循签,經(jīng)常使用第三方來操作级乐,也就是fmdb
coreData:也是數(shù)據(jù)庫儲存,蘋果官方的
18.說一下appdelegate的幾個方法县匠?從后臺到前臺調(diào)用了哪些方法风科?第一次啟動調(diào)用了哪些方法?從前臺到后臺調(diào)用了哪些方法乞旦?
1029210 (1).gif
19.NSCache優(yōu)于NSDictionary的幾點贼穆?
1.nscache 是可以自動釋放內(nèi)存的。
2.nscache是線程安全的兰粉,我們可以在不同的線程中添加故痊,刪除和查詢緩存中的對象。
3.一個緩存對象不會拷貝key對象玖姑。
20.知不知道Designated Initializer愕秫?使用它的時候有什么需要注意的問題?
個人理解:初始化函數(shù)焰络,如果你想自定義初始化函數(shù)時戴甩,也是必須要初始化父類,以來保證可以繼承父類的一些方法或者屬性闪彼。
21.實現(xiàn)description方法能取到什么效果甜孤?
description是nsobject的一個實例的方法,返回的是一個nsstring备蚓。當我們使用nslog打印的時候课蔬,打印出來的一般都是對象的內(nèi)存地址囱稽,如果我們實現(xiàn)description方法時郊尝,我們就可以使用nslog打印對象的時候,我們可以把它里面的屬性值和內(nèi)存地址一起打印出來.打印什么战惊,就是看你寫什么了流昏。
-(NSString*)description{NSString* string = [NSStringstringWithFormat:@"",self,self.name,self.age];returnstring;? ? ? }
22.objc使用什么機制管理對象內(nèi)存?
使用內(nèi)存管理計數(shù)器吞获,來管理內(nèi)存的况凉。當內(nèi)存管理計數(shù)器為0的時候,對象就會被釋放各拷。
中級
Block
1.block的實質(zhì)是什么刁绒?一共有幾種block?都是什么情況下生成的烤黍?
block:本質(zhì)就是一個object-c對象.
block:存儲位置知市,可能分為3個地方:代碼去傻盟,堆區(qū)、棧區(qū)(ARC情況下會自動拷貝到堆區(qū)嫂丙,因此ARC下只能有兩個地方:代碼去娘赴、堆區(qū))
代碼區(qū):不訪問棧區(qū)的變量(如局部變量),且不訪問堆區(qū)的變量(alloc創(chuàng)建的對象)跟啤,此時block存放在代碼去诽表。
堆區(qū):訪問了處于棧區(qū)的變量,或者堆區(qū)的變量隅肥,此時block存放在堆區(qū)竿奏。–需要注意實際是放在棧區(qū),在ARC情況下會自動拷貝到堆區(qū)武福,如果不是ARC則存放在棧區(qū)议双,所在函數(shù)執(zhí)行完畢就回釋放,想再外面調(diào)用需要用copy指向它捉片,這樣就拷貝到了堆區(qū)平痰,strong屬性不會拷貝、會造成野指針錯區(qū)伍纫。
2.為什么在默認情況下無法修改被block捕獲的變量宗雇? __block都做了什么?
默認情況下莹规,block里面的變量赔蒲,拷貝進去的是變量的值,而不是指向變量的內(nèi)存的指針良漱。
當使用__block修飾后的變量舞虱,拷貝到block里面的就是指向變量的指針,所以我們就可以修改變量的值母市。
3.模擬一下循環(huán)引用的一個情況矾兜?block實現(xiàn)界面反向傳值如何實現(xiàn)?
Person *p = [[Person alloc]init];[p setPersonBlock:^(NSString*str) {? ? p.name = str;}];
Runtime
1.objc在向一個對象發(fā)送消息時患久,發(fā)生了什么椅寺?
根據(jù)對象的isa指針找到類對象id,在查詢類對象里面的methodLists方法函數(shù)列表蒋失,如果沒有在好到返帕,在沿著superClass,尋找父類,再在父類methodLists方法列表里面查詢篙挽,最終找到SEL,根據(jù)id和SEL確認IMP(指針函數(shù)),在發(fā)送消息荆萤;
3.什么時候會報unrecognized selector錯誤?iOS有哪些機制來避免走到這一步铣卡?
當發(fā)送消息的時候链韭,我們會根據(jù)類里面的methodLists列表去查詢我們要動用的SEL,當查詢不到的時候邑闲,我們會一直沿著父類查詢,當最終查詢不到的時候我們會報unrecognized selector錯誤
當系統(tǒng)查詢不到方法的時候梧油,會調(diào)用+(BOOL)resolveInstanceMethod:(SEL)sel動態(tài)解釋的方法來給我一次機會來添加苫耸,調(diào)用不到的方法±茉桑或者我們可以再次使用-(id)forwardingTargetForSelector:(SEL)aSelector重定向的方法來告訴系統(tǒng)褪子,該調(diào)用什么方法,一來保證不會崩潰骗村。
4.能否向編譯后得到的類中增加實例變量嫌褪?能否向運行時創(chuàng)建的類中添加實例變量?為什么胚股?
1.不能向編譯后得到的類增加實例變量
2.能向運行時創(chuàng)建的類中添加實例變量
解釋:
1.編譯后的類已經(jīng)注冊在runtime中,類結(jié)構(gòu)體中的objc_ivar_list實例變量的鏈表和instance_size實例變量的內(nèi)存大小已經(jīng)確定,runtime會調(diào)用class_setvarlayout或class_setWeaklvarLayout來處理strong weak引用.所以不能向存在的類中添加實例變量
2.運行時創(chuàng)建的類是可以添加實例變量,調(diào)用class_addIvar函數(shù).但是的在調(diào)用objc_allocateClassPair之后,objc_registerClassPair之前,原因同上.
5.runtime如何實現(xiàn)weak變量的自動置nil笼痛?
runtime 對注冊的類, 會進行布局琅拌,對于 weak 對象會放入一個 hash 表中缨伊。 用 weak 指向的對象內(nèi)存地址作為 key,當此對象的引用計數(shù)為0的時候會 dealloc进宝,假如 weak 指向的對象內(nèi)存地址是a刻坊,那么就會以a為鍵, 在這個 weak 表中搜索党晋,找到所有以a為鍵的 weak 對象谭胚,從而設(shè)置為 nil。
6.給類添加一個屬性后未玻,在類結(jié)構(gòu)體里哪些元素會發(fā)生變化灾而?
instance_size :實例的內(nèi)存大小
objc_ivar_list *ivars:屬性列表
RunLoop
1.runloop是來做什么的?runloop和線程有什么關(guān)系扳剿?主線程默認開啟了runloop么旁趟?子線程呢?
runloop:字面意思就是跑圈舞终,其實也就是一個循環(huán)跑圈轻庆,用來處理線程里面的事件和消息癣猾。
runloop和線程的關(guān)系:每個線程如果想繼續(xù)運行敛劝,不被釋放,就必須有一個runloop來不停的跑圈纷宇,以來處理線程里面的各個事件和消息夸盟。
主線程默認是開啟一個runloop。也就是這個runloop才能保證我們程序正常的運行像捶。子線程是默認沒有開始runloop的
2.runloop的mode是用來做什么的上陕?有幾種mode桩砰?
model:是runloop里面的模式,不同的模式下的runloop處理的事件和消息有一定的差別释簿。
系統(tǒng)默認注冊了5個Mode:
(1)kCFRunLoopDefaultMode: App的默認 Mode亚隅,通常主線程是在這個 Mode 下運行的。
(2)UITrackingRunLoopMode: 界面跟蹤 Mode庶溶,用于 ScrollView 追蹤觸摸滑動煮纵,保證界面滑動時不受其他 Mode 影響。
(3)UIInitializationRunLoopMode: 在剛啟動 App 時第進入的第一個 Mode偏螺,啟動完成后就不再使用行疏。
(4)GSEventReceiveRunLoopMode: 接受系統(tǒng)事件的內(nèi)部 Mode,通常用不到套像。
(5)kCFRunLoopCommonModes: 這是一個占位的 Mode酿联,沒有實際作用。
注意iOS 對以上5中model進行了封裝
NSDefaultRunLoopMode;
NSRunLoopCommonModes
3.為什么把NSTimer對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運行循環(huán)以后夺巩,滑動scrollview的時候NSTimer卻不動了贞让?
nstime對象是在NSDefaultRunLoopMode下面調(diào)用消息的,但是當我們滑動scrollview的時候柳譬,NSDefaultRunLoopMode模式就自動切換到UITrackingRunLoopMode模式下面震桶,卻不可以繼續(xù)響應(yīng)nstime發(fā)送的消息。所以如果想在滑動scrollview的情況下面還調(diào)用nstime的消息征绎,我們可以把nsrunloop的模式更改為NSRunLoopCommonModes
4.蘋果是如何實現(xiàn)Autorelease Pool的蹲姐?
Autorelease Pool作用:緩存池,可以避免我們經(jīng)常寫relase的一種方式人柿。其實就是延遲release柴墩,將創(chuàng)建的對象,添加到最近的autoreleasePool中凫岖,等到autoreleasePool作用域結(jié)束的時候江咳,會將里面所有的對象的引用計數(shù)器-1.
類結(jié)構(gòu)
1.isa指針?(對象的isa哥放,類對象的isa歼指,元類的isa都要說)
在oc中,類也是對象甥雕,所屬元類踩身。所以經(jīng)常說:萬物皆對象
對象的isa指針指向所屬的類
類的isa指針指向了所屬的元類
元類的isa指向了根元類,根元類指向了自己社露。
AC17D0A0-CB2A-4C23-8430-4BC7A99571CE.png
2.類方法和實例方法有什么區(qū)別挟阻?
調(diào)用的方式不同,類方法必須使用類調(diào)用,在方法里面不能調(diào)用屬性附鸽,類方法里面也必須調(diào)用類方法脱拼。存儲在元類結(jié)構(gòu)體里面的methodLists里面
實例方法必須使用實例對象調(diào)用,可以在實例方法里面使用屬性坷备,實例方法也必須調(diào)用實例方法熄浓。存儲在類結(jié)構(gòu)體里面的methodLists里面
3.介紹一下分類,能用分類做什么省撑?內(nèi)部是如何實現(xiàn)的玉组?它為什么會覆蓋掉原來的方法?
category:我們可以給類或者系統(tǒng)類添加實例方法方法丁侄。我們添加的實例方法惯雳,會被動態(tài)的添加到類結(jié)構(gòu)里面的methodList列表里面。categort
4.運行時能增加成員變量么鸿摇?能增加屬性么石景?如果能,如何增加拙吉?如果不能潮孽,為什么?
可以添加屬性的筷黔,但必須我們實現(xiàn)它的getter和setter方法往史。但是沒有添加帶下滑線同名的成員變量
但是我們使用runtime我們就可以實現(xiàn)添加成員變量方法如下
- (void)setName:(NSString *)name {/** *? 為某個類關(guān)聯(lián)某個對象 * *@paramobject#> 要關(guān)聯(lián)的對象 description#> *@paramkey#>? ? 要關(guān)聯(lián)的屬性key description#> *@paramvalue#>? 你要關(guān)聯(lián)的屬性 description#> *@parampolicy#> 添加的成員變量的修飾符 description#> */objc_setAssociatedObject(self, @selector(name), name,? OBJC_ASSOCIATION_COPY_NONATOMIC);}- (NSString *)name {/** *? 獲取到某個類的某個關(guān)聯(lián)對象 * *@paramobject#> 關(guān)聯(lián)的對象 description#> *@paramkey#>? ? 屬性的key值 description#> */returnobjc_getAssociatedObject(self, @selector(name));}
5.objc中向一個nil對象發(fā)送消息將會發(fā)生什么?(返回值是對象佛舱,是標量椎例,結(jié)構(gòu)體)
? 如果一個方法返回值是一個對象,那么發(fā)送給nil的消息將返回0(nil)请祖。例如:Person * motherInlaw = [ aPerson spouse] mother]; 如果spouse對象為nil订歪,那么發(fā)送給nil的消息mother也將返回nil。
? 如果方法返回值為指針類型肆捕,其指針大小為小于或者等于sizeof(void*)刷晋,float,double慎陵,long double 或者long long的整型標量眼虱,發(fā)送給nil的消息將返回0。
? 如果方法返回值為結(jié)構(gòu)體席纽,正如在《Mac OS X ABI 函數(shù)調(diào)用指南》捏悬,發(fā)送給nil的消息將返回0。結(jié)構(gòu)體中各個字段的值將都是0胆筒。其他的結(jié)構(gòu)體數(shù)據(jù)類型將不是用0填充的邮破。
? 如果方法的返回值不是上述提到的幾種情況,那么發(fā)送給nil的消息的返回值將是未定義的仆救。
高級
1.UITableview的優(yōu)化方法(緩存高度抒和,異步繪制,減少層級彤蔽,hide摧莽,避免離屏渲染)
緩存高度:當我們創(chuàng)建frame模型的時候,計算出來cell的高度的時候顿痪,我們可以將cell的高度緩存到字典里面镊辕,以cell的indexpath和Identifier作為為key。
NSString*key = [[HeightCache shareHeightCache] makeKeyWithIdentifier:@"YwywProductGradeCell"indexPath:indexPath];if([[HeightCache shareHeightCache] existInCacheByKey:key]) {return[[HeightCache shareHeightCache] heightFromCacheWithKey:key];}else{? ? YwywProductGradeModelFrame *modelFrame =self.gradeArray[indexPath.row];? ? [[HeightCache shareHeightCache] cacheHieght:modelFrame.cellHight key:key];returnmodelFrame.cellHight;}
異步繪制蚁袭、減少層級:目前還不是很清楚
hide:個人理解應(yīng)該是hidden吧征懈,把可能會用到的控件都創(chuàng)建出來,根據(jù)不同的情況去隱藏或者顯示出來揩悄。
避免離屏渲染:只要不是同時使用邊框/邊框顏色以及圓角的時候卖哎,都可以使用layer直接設(shè)置。不會造成離屏渲染删性。
2.有沒有用過運行時亏娜,用它都能做什么?(交換方法蹬挺,創(chuàng)建類维贺,給新創(chuàng)建的類增加方法,改變isa指針)
交換方式:一般寫在類的+(void)load方法里面
/** 獲取原始setBackgroundColor方法 */Method originalM = class_getInstanceMethod([selfclass],@selector(setBackgroundColor:));/** 獲取自定義的pb_setBackgroundColor方法 */Method exchangeM = class_getInstanceMethod([selfclass],@selector(pb_setBackgroundColor:));/** 交換方法 */method_exchangeImplementations(originalM, exchangeM);
創(chuàng)建類:
Class MyClass = objc_allocateClassPair([NSObjectclass],"Person",0);
添加方法
/**參數(shù)一巴帮、類名參數(shù)
? 二溯泣、SEL 添加的方法名字參數(shù)
? ? 三、IMP指針 (IMP就是Implementation的縮寫榕茧,它是指向一個方法實現(xiàn)的指針发乔,每一個方法都有一個對應(yīng)的IMP)
? 參數(shù)四、其中types參數(shù)為"i@:@“雪猪,按順序分別表示:具體類型可參照[官方文檔](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)i 返回值類型int栏尚,若是v則表示void@ 參數(shù)id(self): SEL(_cmd)@ id(str)
? V@:表示返回值是void 帶有SEL參數(shù) (An object (whether statically typed or typed id))
? */class_addMethod(Person,@selector(addMethodForMyClass:), (IMP)addMethodForMyClass,"V@:");
添加實例變量
/**參數(shù)一、類名參數(shù)
? 二只恨、屬性名稱參數(shù)
? 三译仗、開辟字節(jié)長度參數(shù)
? 四、對其方式參數(shù)
? 五官觅、參數(shù)類型 “@” 官方解釋 An object (whether statically typed or typed id) (對象 靜態(tài)類型或者id類型) 具體類型可參照[官方文檔](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html)return: BOOL 是否添加成功
? */BOOLisSuccess = class_addIvar(Person,"name",sizeof(NSString*),0,"@");isSuccess?NSLog(@"添加變量成功"):NSLog(@"添加變量失敗");
3.看過哪些第三方框架的源碼纵菌?都是如何實現(xiàn)的?(如果沒有休涤,問一下多圖下載的設(shè)計)
4.SDWebImage的緩存策略咱圆?
sd加載一張圖片的時候笛辟,會先在內(nèi)存里面查找是否有這張圖片,如果沒有會根據(jù)圖片的md5(url)后的名稱去沙盒里面去尋找序苏,是否有這張圖片手幢,如果沒有會開辟線程去下載,下載完畢后加載到imageview上面忱详,并md(url)為名稱緩存到沙盒里面围来。
5.AFN為什么添加一條常駐線程?
AFN 目的:就是開辟線程請求網(wǎng)絡(luò)數(shù)據(jù)匈睁。如果沒有常住線程的話监透,就會每次請求網(wǎng)絡(luò)就去開辟線程,完成之后銷毀開辟線程航唆,這樣就造成資源的浪費胀蛮,開辟一條常住線程,就可以避免這種浪費糯钙,我們可以在每次的網(wǎng)絡(luò)請求都添加到這條線程醇滥。
6.KVO的使用?實現(xiàn)原理超营?(為什么要創(chuàng)建子類來實現(xiàn))
kvo:鍵值觀察鸳玩,根據(jù)鍵對應(yīng)的值的變化,來調(diào)用方法演闭。
注冊觀察者:addObserver:forKeyPath:options:context:
實現(xiàn)觀察者:observeValueForKeyPath:ofObject:change:context:
移除觀察者:removeObserver:forKeyPath:(對象銷毀不跟,必須移除觀察者)
注意
使用kvo監(jiān)聽A對象的時候,監(jiān)聽的本質(zhì)不是這個A對象米碰,而是系統(tǒng)創(chuàng)建的一個中間對象NSKVONotifying_A并繼承A對象窝革,并且A對象的isa指針指向的也不是A的類,而是這個NSKVONotifying_A對象
7.KVC的使用吕座?實現(xiàn)原理虐译?(KVC拿到key以后,是如何賦值的吴趴?知不知道集合操作符漆诽,能不能訪問私有屬性,能不能直接訪問_ivar)
kvc:鍵值賦值锣枝,使用最多的即使字典轉(zhuǎn)模型厢拭。利用runtime獲取對象的所有成員變量, 在根據(jù)kvc鍵值賦值撇叁,進行字典轉(zhuǎn)模型
setValue: forKey: 只查找本類里面的屬性
setValue: forKeyPath:會查找本類里面屬性供鸠,沒有會繼續(xù)查找父類里面屬性。
項目
1.有已經(jīng)上線的項目么陨闹?
2.項目里哪個部分是你完成的楞捂?(找一個亮點問一下如何實現(xiàn)的)
3.開發(fā)過程中遇到過什么困難薄坏,是如何解決的?
學(xué)習
4.遇到一個問題完全不能理解的時候寨闹,是如何幫助自己理解的胶坠?舉個例子?
5.有看書的習慣么鼻忠?最近看的一本是什么書涵但?有什么心得杈绸?
6.有沒有使用一些筆記軟件帖蔓?會在多平臺同步以及多渠道采集么?(如果沒有瞳脓,問一下是如何復(fù)習知識的)
7.有沒有使用清單類塑娇,日歷類的軟件?(如果沒有劫侧,問一下是如何安排埋酬,計劃任務(wù)的)
8.平常看博客么烧栋?有沒有自己寫過写妥?(如果寫,有哪些收獲审姓?如果沒有寫珍特,問一下不寫的原因)