總結了一堆面試題,希望能對大家有一些幫助!
static的作用会油?
(1)static修飾的函數(shù)是一個內(nèi)部函數(shù),只能在本文件中調(diào)用贾费,其他文件不能調(diào)用钦购。
(2)static修飾的全部變量是一個內(nèi)部變量,只能在本文件中使用褂萧,其他文件不能使用押桃。
(2)static修飾的局部變量只會初始化一次,并且在程序退出時才會回收內(nèi)存导犹。runtime介紹
http://www.reibang.com/p/8836dfac7f2c-
TCP等
未命名文件.jpg
4.GET和POST的區(qū)別
5.tableView的重用機制
首先需要注冊class唱凯,意思就是告訴tableView,首先去緩沖池中找有沒有可重用的cell谎痢,如果有磕昼,則拿過來重用;如果沒有节猿,那么根據(jù)之前注冊的UITableViewCell這個類票从,來自動生成一個cell,并且給它綁定上重用identifier滨嘱。
6.減少cellForRowAtIndexPath代理中的計算量
首先要提前計算每個cell中需要的一些基本數(shù)據(jù)峰鄙,代理調(diào)用的時候直接取出;
圖片要異步加載太雨,加載完成后再根據(jù)cell內(nèi)部UIImageView的引用設置圖片吟榴;
圖片數(shù)量多時,圖片的尺寸要跟據(jù)需要提前經(jīng)過transform矩陣變換壓縮好(直接設置圖片的contentMode讓其自行壓縮仍然會影響滾動效率)囊扳,必要的時候要準備好預覽圖和高清圖吩翻,需要時再加載高清圖。
圖片的’懶加載’方法锥咸,即延遲加載狭瞎,當滾動速度很快時避免頻繁請求服務器數(shù)據(jù)。
盡量手動Drawing視圖提升流暢性她君,而不是直接子類化UITableViewCell脚作,然后覆蓋drawRect方法,因為cell中不是只有一個contentview。繪制cell不建議使用UIView球涛,建議使用CALayer劣针。原因要參考UIView和CALayer的區(qū)別和聯(lián)系。
減少heightForRowAtIndexPath代理中的計算量
由于每次TableView進行update更新都會對每一個cell調(diào)用heightForRowAtIndexPath代理取得最新的height亿扁,會大大增加計算時間捺典。如果表格的所有cell高度都是固定的,那么去掉heightForRowAtIndexPath代理从祝,直接設置TableView的rowHeight屬性為固定的高度襟己;
如果高度不固定,應盡量將cell的高度數(shù)據(jù)計算好并儲存起來牍陌,代理調(diào)用的時候直接取擎浴,即將height的計算時間復雜度降到O(1)。例如:在異步請求服務器數(shù)據(jù)時毒涧,提前將cell高度計算好并作為dataSource的一個數(shù)據(jù)存到數(shù)據(jù)庫供隨時取用贮预。
當cell為nil,需要創(chuàng)建新的cell的時候契讲,使用的是initWithStyle:reuseIdentifier:方法仿吞,而不是init方法,這樣做是因為創(chuàng)建新的cell的時候需要綁定一個identifier捡偏,這樣在重用的時候才能找到可重用的相同類型椎椰。如果使用init方法則沒有綁定identifier耳高,這樣在重用的時候無法成功找到對應的可重用的cell。
一般在if(!cell)中姻几,也就是在新創(chuàng)建cell的時候塔猾,將一些只需要初始化一次的屬性進行初始化喂击,而不是在這個括號的外面茂契。因為在括號外面會執(zhí)行多次饮亏,而這些屬性并不需要多次設置。同樣忠藤,如果不同的cell需要設置不同屬性或數(shù)據(jù),那么需要在括號外執(zhí)行楼雹,因為括號外面每次cell出現(xiàn)都會執(zhí)行到模孩,這樣可以保證不用的cell對應不同的屬性或數(shù)據(jù)。如果將本該設置不同cell對應不同屬性的代碼放在括號里面贮缅,在復用cell的時候不會重新覆蓋這些數(shù)據(jù)榨咐,會出現(xiàn)不正確的結果,造成數(shù)據(jù)冗余的問題
7.weak的實現(xiàn)原理
http://www.cocoachina.com/ios/20171213/21520.html
8.nonatomic和atomic的區(qū)別
nonatomic:表示非原子谴供,不安全块茁,但是效率高。
atomic:表示原子行,安全数焊,但是效率定永淌。
atomic:不能絕對保證線程的安全,當多線程同時訪問的時候佩耳,會造成線程不安全遂蛀。可以使用線程鎖來保證線程的安全干厚。
9.進程與線程
進程:是具有一定獨立功能的程序關于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位.
線程:是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
同步:阻塞當前線程操作李滴,不能開辟線程。
異步:不阻礙線程繼續(xù)操作蛮瞄,可以開辟線程來執(zhí)行任務所坯。
并發(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í)行
10.block的本質(zhì)
1)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里面的就是指向變量的指針钾麸,所以我們就可以修改變量的值更振。
11.app開啟之后,在執(zhí)行main之前都干了什么事?
1、APP啟動時間
1)main之前的系統(tǒng)dylib(動態(tài)鏈接庫)和自身App可執(zhí)行文件的加載的時間
2)main之后執(zhí)行didFinishLaunchingWithOptions:結束前的時間
2饭尝、main之前的加載過程
1)首先加載可執(zhí)行文件(自身app的所有.o文件集合)
2)然后加載動態(tài)鏈接庫dyld肯腕,dyld是一個專門用來加載動態(tài)鏈接庫的庫
3)執(zhí)行從dyld開始,dyld從可執(zhí)行文件的依賴開始钥平,遞歸加載所有的依賴動態(tài)鏈接庫
4)動態(tài)鏈接庫包括:iOS中用到的所有系統(tǒng)的framework实撒,加載OC runtime方法的libobjec,系統(tǒng)級別的libSystem,例如libdispatch(GCD)he libsystem_blocks(Block)
5)dyld:the dynamic link editor,所有動態(tài)鏈接庫和我們App的靜態(tài)庫.a和所有類文件編譯后.o文件涉瘾,最終都由dyld加載到內(nèi)存的
3奈惑、動態(tài)鏈接庫庫是相對于系統(tǒng)來講的
4、可執(zhí)行文件是相對于App本身來講的
5睡汹、每個app 都是以鏡像為單位進行加載的
1)鏡像(Mirroring)是冗余的一種類型,一個磁盤上的數(shù)據(jù)在另一個磁盤上存在一個完全相同的副本即為鏡像寂殉。
2)鏡像是一種文件存儲形式囚巴,可以把許多文件做成一個鏡像文件。
3)每個鏡像又都有個ImageLoader類來負責加載,一一對應的關系
6彤叉、framework 是動態(tài)鏈接庫和相應資源包含在一起的一個文件結構
7庶柿、系統(tǒng)使用動態(tài)鏈接庫的好處
1)代碼共用:很多程序都動態(tài)鏈接了這些lib,但它們在內(nèi)存和磁盤中只有一份
2)易于維護:由于被依賴的lib是程序執(zhí)行時才鏈接的秽浇,所以這些很容易更新浮庐,只要保證在程序執(zhí)行之前,獲取最新lib即可
3)減少可執(zhí)行文件體積:相比靜態(tài)鏈接柬焕,動態(tài)鏈接在編譯時不需要打進去审残,所有可執(zhí)行文件的體積要小很多
8、動態(tài)鏈接庫的加載步驟具體分為5步
1)load dylibs image 讀取庫鏡像文件
2)Rebase image 重定位鏡像
3)Bind image 組裝鏡像
4)Objc setup 設置對象
5)initializers 初始化
9斑举、第一步又分為下面6個過程
1)分析所依賴的動態(tài)庫
2)找到動態(tài)庫的mach-o 文件(我們知道Windows下的文件都是PE文件搅轿,同樣在OS X和iOS中可執(zhí)行文件是Mach-o格式的。)
3)打開文件
4)驗證文件
5)在系統(tǒng)核心注冊文件簽名
6)對動態(tài)庫的每一個segment調(diào)用mmap()
由于ASLR(address apace layout randomization)的存在富玷,可執(zhí)行文件和動態(tài)鏈接庫在虛擬內(nèi)存中的加載地址每次啟動都不固定璧坟,所以需要這兩步倆修復鏡像中的資源地址,來紙箱正確的地址
1)rabase 修復的是指當前鏡像內(nèi)存的資源指針赎懦;bind指向的是鏡像外部的資源指針
2)rebase步驟先進行雀鹃,需要把鏡像讀入內(nèi)存,并以page為單位進行加密驗證励两,保證不會被篡改黎茎;bind 在其后進行,由于要查詢表符號表伐蒋,來指向鏡像的資源工三;
- 注冊objc類
2)把category的定義插入方法列表
3)保證每個selector唯一
0)以上三步屬于靜態(tài)調(diào)整(fix up),都是在修改__DATA segment中內(nèi)容先鱼,從這里開始動態(tài)調(diào)整俭正,開始在堆和堆棧寫入內(nèi)容
1)objc 的 + load 函數(shù)
2)C++的構造函數(shù)屬性函數(shù) 形如 attribute((contructor))void DoSomeInitializationWork()
3)非基本類型的C++靜態(tài)全局變量的創(chuàng)建(通常是類或結構體)(non-trivial initializer)重大初始化
13、再次回顧整個調(diào)用順序
1)dyld 開始將程序二進制文件初始化
2)交由ImageLoader 讀取 image焙畔,其中包含了我們的類掸读,方法等各種符號(Class、Protocol 宏多、Selector儿惫、 IMP)
3)由于runtime 向dyld 綁定了回調(diào),當image加載到內(nèi)存后伸但,dyld會通知runtime進行處理
4)runtime 接手后調(diào)用map_images做解析和處理
5)接下來load_images 中調(diào)用call_load_methods方法肾请,遍歷所有加載進來的Class,按繼承層次依次調(diào)用Class的+load和其他Category的+load方法
6)至此 所有的信息都被加載到內(nèi)存中
7)最后dyld調(diào)用真正的main函數(shù)
8)注意:dyld會緩存上一次把信息加載內(nèi)存的緩存更胖,所以第二次比第一次啟動快一點
同時在網(wǎng)上找了一個這個,
https://blog.csdn.net/demondev/article/details/52347136
12.iOS開發(fā)中BitCode功能
http://www.reibang.com/p/8eff48e5c010
10.另一篇很好的面試題,我從頭看到尾的. 推薦大家一定要看看這個...因為很多我想寫的,他這里都有.我要在寫一遍,總有一種照人抄的感覺..哈哈!
http://www.reibang.com/p/f9eb6b315c08
11.簡單看看這個也行,也是一個面試題,可能是哪個公司的面試題吧...
http://www.reibang.com/p/2aef7e5aef15