iOS面試-基礎(chǔ)

[toc]


Runloop

  1. Runloop本質(zhì)上是一個(gè)實(shí)現(xiàn)“閑”等待的do-while循環(huán)锋叨。
  2. 用來讓App中的線程在有任務(wù)的時(shí)候讓進(jìn)入處理狀態(tài),沒有任務(wù)的時(shí)候進(jìn)入休閑狀態(tài),以此節(jié)省CPU資源,提升App性能陷寝。
  3. Runloop對(duì)象創(chuàng)建后,會(huì)保存在一個(gè)全局dictionary內(nèi)其馏,以線程作為key凤跑,runloop對(duì)象作為value。runloop和線程是一一對(duì)應(yīng)的關(guān)系尝偎。一個(gè)Runloop對(duì)象里面包含了多個(gè)RunLoopMode饶火,每個(gè)RunLoopMode中又包含source0鹏控、source1致扯、timer、observer当辐;每次Runloop啟動(dòng)只能指定一個(gè)mode抖僵。如果需要切換mode,只能重啟runloop缘揪,目的是為了分隔不同的數(shù)據(jù)souce/timer/observer,保證互不受影響耍群。source0處理應(yīng)用層事件义桂,source1處理系統(tǒng)層事件,timer是時(shí)間觸發(fā)器(接收消息的port固定)蹈垢,NSTimer就是基于timer的慷吊,observer是消息循環(huán)中的一個(gè)監(jiān)聽器,隨時(shí)通知外部當(dāng)前RunLoop的運(yùn)行狀態(tài)曹抬。
  4. 在實(shí)際開發(fā)過程中溉瓶,主要涉及的場(chǎng)景有:線程保活(分擔(dān)主線程壓力)谤民、延遲加載圖片(保證流暢性)堰酿、NSTimer在界面滑動(dòng)時(shí)停止回調(diào)解決、檢測(cè)應(yīng)用卡頓

擴(kuò)展

  • 子線程默認(rèn)沒有runloop张足,需要手動(dòng)通過懶加載的方式創(chuàng)建触创,并運(yùn)行起來
  • NSTimer使用之前需要注冊(cè)到runloop中,其回調(diào)是基于runloop的为牍,如果runloop中執(zhí)行的任務(wù)耗時(shí)過長(zhǎng)哼绑,那么就只能等到下個(gè)時(shí)間點(diǎn)回調(diào),因此導(dǎo)致NSTimer不太準(zhǔn)確碉咆。
  • observer監(jiān)聽的狀態(tài)有
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
        kCFRunLoopEntry = (1UL << 0), // 進(jìn)入RunLoop 
        kCFRunLoopBeforeTimers = (1UL << 1), // 即將開始Timer處理
        kCFRunLoopBeforeSources = (1UL << 2), // 即將開始Source處理
        kCFRunLoopBeforeWaiting = (1UL << 5), // 即將進(jìn)入休眠
        kCFRunLoopAfterWaiting = (1UL << 6), //從休眠狀態(tài)喚醒
        kCFRunLoopExit = (1UL << 7), //退出RunLoop
        kCFRunLoopAllActivities = 0x0FFFFFFFU
    };
  • 應(yīng)用卡頓監(jiān)聽的是停留在其中一個(gè)狀態(tài)的時(shí)間過長(zhǎng)

AutoReleasePool

  1. 自動(dòng)釋放池是一種內(nèi)存自動(dòng)回收機(jī)制凌那,是由AutoReleasePoolPage連接實(shí)現(xiàn)的雙向列表。
  2. 自動(dòng)釋放池可以延時(shí)釋放對(duì)象吟逝。正常情況下變量會(huì)在超出作用域后立即release帽蝶,加入釋放池后,會(huì)等到runloop休眠 或者 超出作用域后release块攒。

多線程

響應(yīng)者鏈

消息響應(yīng)機(jī)制

消息轉(zhuǎn)發(fā)機(jī)制

App在pre-main階段的活動(dòng)

動(dòng)態(tài)庫 和 靜態(tài)庫 區(qū)別

iOS內(nèi)存管理

OC對(duì)象內(nèi)存布局

WKWebview 如何實(shí)現(xiàn)js交互

內(nèi)存空間 (堆和棧的區(qū)別)

主要分為 五大區(qū)

  1. 棧區(qū) Stack
  2. 堆區(qū) Head
  3. 全局/靜態(tài)區(qū)
  4. 文字/常量區(qū)
  5. 代碼區(qū) code
內(nèi)存分布
  • 棧區(qū)

特點(diǎn):是一塊連續(xù)的內(nèi)存區(qū)域励稳,先進(jìn)后出,后進(jìn)先出(方便用來保存/恢復(fù)現(xiàn)場(chǎng)調(diào)用)囱井;從高地址到低地址分配驹尼;
用于存放臨時(shí)創(chuàng)建的局部變量;指針都在棧區(qū)(指針指向的堆區(qū)的地址);
一般情況下,地址0x7xxxx是棧區(qū)庞呕;
優(yōu)點(diǎn): 編譯器自動(dòng)分配釋放新翎,不會(huì)產(chǎn)生內(nèi)存碎片,使用起來快速高效
缺點(diǎn): 內(nèi)存大小有限制住练,數(shù)據(jù)不靈活(主線程大小只有1MB地啰,其他線程512KB)

  • 堆區(qū)

特點(diǎn):是一塊不連續(xù)的內(nèi)存區(qū)域,先進(jìn)先出原則讲逛;從低地址向高地址分配
當(dāng)需要訪問堆中內(nèi)存時(shí)亏吝,一般需要先通過對(duì)象讀取到棧區(qū)的指針地址,然后通過指針訪問堆區(qū)盏混。
地址0x6xxxx是堆區(qū)蔚鸥;
優(yōu)點(diǎn): 靈活方便
缺點(diǎn): 速度較棧慢惜论,容易產(chǎn)生內(nèi)存碎片

  • 全局區(qū)

特點(diǎn): 編譯時(shí)分配,一般以0x1xxxx開頭止喷;
程序運(yùn)行過程中馆类,此內(nèi)存數(shù)據(jù)一直存在,程序結(jié)束后釋放弹谁;
分為 未初始化 和 已初始化的兩個(gè)區(qū)間蹦掐;
包含全局變量 和 靜態(tài)變量,全局變量指向的變量值可以被修改僵闯;靜態(tài)變量時(shí)static修飾的變量卧抗,包含靜態(tài)局部變量和全局變量。

  • 常量區(qū)

特點(diǎn): 編譯時(shí)分配鳖粟,程序結(jié)束后由系統(tǒng)釋放社裆;
存放 已經(jīng)使用了的,且沒有指向的字符串常量向图;

  • 代碼區(qū)

編譯時(shí)分配泳秀,主要用于存放程序運(yùn)行時(shí)的代碼(二進(jìn)制)


內(nèi)存泄漏

  1. 申請(qǐng)的內(nèi)存空間使用完畢后未回收。
  2. 多次內(nèi)存泄漏榄攀,不斷消耗內(nèi)存空間嗜傅,最終會(huì)導(dǎo)致崩潰。
  3. 原因:(1)檩赢、循環(huán)引用:NSTimer直接使用 (2)吕嘀、循環(huán)引用:strong修飾的Delegate (3)、循環(huán)引用:Block (4)贞瞒、CF對(duì)象(C語言偶房,ARC只支持OC)未手動(dòng)釋放 (5)、被全局變量直接或間接持有军浆,未斷開
  4. 檢測(cè)方案 (1)棕洋、開發(fā)階段:靜態(tài)分析(Analyze)(2)、開發(fā)階段:動(dòng)態(tài)分析方法(Instrument的Leaks) (3)乒融、測(cè)試階段:使用自定義工具(或三方工具檢測(cè)內(nèi)存泄漏掰盘,如 哆啦A夢(mèng))
  • Analyze 檢測(cè)的類型

1、邏輯錯(cuò)誤 2赞季、聲明錯(cuò)誤 3愧捕、內(nèi)存泄漏 4、引用Api錯(cuò)誤

  • Leaks 檢測(cè)原理

直接搜索內(nèi)存區(qū)間進(jìn)行檢查是否有引用碟摆,沒有引用的卻還在使用的內(nèi)存就是泄漏

  • 三方檢測(cè)

MLeaksFinder: 當(dāng)一個(gè)controller被pop或者dismiss掉后晃财,其view和subView也會(huì)很快被釋放掉,3秒后查看是否還存在典蜕,如果存在就是內(nèi)存泄漏
優(yōu)點(diǎn): 無侵入性断盛,可支持白名單
FBRetainCycleDetector : 查找以該對(duì)象為根節(jié)點(diǎn)的強(qiáng)引用樹中有沒有循環(huán)引用。


渲染原理(離屏渲染)

深拷貝/淺拷貝(copy/multableCopy)

屬性修飾符的作用

各種線程鎖

NotificationCenter實(shí)現(xiàn)原理

KVO實(shí)現(xiàn)原理

Window的作用

runtime

  • 如何添加屬性
  • category愉舔,method 的實(shí)現(xiàn)機(jī)制钢猛,class的載入過程

NSCoding協(xié)議

@synthesize 和 @dynamic 分別有什么作用?

id和NSObject*的區(qū)別

系統(tǒng)的block api轩缤,是否也考慮引用循環(huán)問題命迈?

Core Graphic、CGPath火的、maskLayer 作用


Swift如何實(shí)現(xiàn)KVO壶愤?

Struct 和 Class 區(qū)別 優(yōu)缺點(diǎn)?

消息發(fā)送機(jī)制

Swift mutating關(guān)鍵字的使用

Swift 和OC 如何相互調(diào)用?

訪問控制關(guān)鍵字

swift 為什么將 String,Array,Dictionary設(shè)計(jì)為值類型?

swift 中的 protoco 和 OC中有什么區(qū)別

swift 中的 enum 和 OC 中 有什么區(qū)別

swfit 中的 閉包 和 block 有什么區(qū)別

閉包的種類

存儲(chǔ)屬性和計(jì)算屬性的區(qū)別

swift 單例模式實(shí)現(xiàn)

最新整理:iOS面試題-常問Swift問題(八)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馏鹤,一起剝皮案震驚了整個(gè)濱河市征椒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湃累,老刑警劉巖勃救,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異治力,居然都是意外死亡蒙秒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門宵统,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晕讲,“玉大人,你說我怎么就攤上這事马澈∫嫘郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵箭券,是天一觀的道長(zhǎng)净捅。 經(jīng)常有香客問我,道長(zhǎng)辩块,這世上最難降的妖魔是什么蛔六? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮废亭,結(jié)果婚禮上国章,老公的妹妹穿的比我還像新娘。我一直安慰自己豆村,他們只是感情好液兽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般四啰。 火紅的嫁衣襯著肌膚如雪宁玫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天柑晒,我揣著相機(jī)與錄音欧瘪,去河邊找鬼。 笑死匙赞,一個(gè)胖子當(dāng)著我的面吹牛佛掖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涌庭,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芥被,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了坐榆?” 一聲冷哼從身側(cè)響起拴魄,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猛拴,沒想到半個(gè)月后羹铅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愉昆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年职员,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跛溉。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焊切,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芳室,到底是詐尸還是另有隱情专肪,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布堪侯,位于F島的核電站嚎尤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伍宦。R本人自食惡果不足惜芽死,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望次洼。 院中可真熱鬧关贵,春花似錦、人聲如沸卖毁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炭剪,卻和暖如春练链,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背念祭。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工兑宇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碍侦,地道東北人粱坤。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓷产,于是被迫代替她去往敵國(guó)和親站玄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1濒旦、簡(jiǎn)述OC中內(nèi)存管理機(jī)制株旷。與retain配對(duì)使用的方法是dealloc還是release,為什么尔邓?需要與allo...
    韋魯斯閱讀 2,135評(píng)論 6 25
  • iOS | 面試知識(shí)整理 - OC底層 (三) 1. 一個(gè)OC對(duì)象占用多少內(nèi)存 系統(tǒng)分配了16個(gè)字節(jié)給NSObje...
    d76d0c9d2b04閱讀 438評(píng)論 0 1
  • 編譯鏈接的過程? 你知道哪些編碼方式? 程序在運(yùn)行時(shí)操作系統(tǒng)除了分配內(nèi)存空間還有什么棚壁? 內(nèi)核態(tài)和用戶態(tài)的區(qū)別掠河? 堆...
    Crics閱讀 1,093評(píng)論 0 1
  • iOS基礎(chǔ)類 這里包含了去哪兒,滴滴灯节,螞蟻金服循头,美團(tuán),今日頭條炎疆,快手以及其它公司的一些面試題卡骂,大部分面試官問的重復(fù)...
    iOS鑫閱讀 646評(píng)論 0 19
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,383評(píng)論 8 265