2019 iOS 面試 -中級篇之 RunLoop

1. runloop是來做什么的乙帮?runloop和線程有什么關(guān)系?主線程默認(rèn)開啟了runloop么俏拱?子線程呢暑塑?

RunLoop(消息循環(huán)):說白了就是一種事件監(jiān)聽循環(huán)。就好比是一個(gè)while循環(huán)锅必,監(jiān)聽到事件就起來梯投,沒有就休息。
基本作用:

  • 1.保持程序的持續(xù)運(yùn)行(這也是iOS程序?yàn)槭裁茨芤恢辈粫?huì)死的原因)。

  • 2.處理App中的各種事件(比如觸摸事件分蓖、selector事件、定時(shí)器事件等)尔许。

  • 3.節(jié)省CPU資源么鹤,提高程序性能,有事件就起來味廊,沒有就休息蒸甜。

Runloop與線程:

  • 1.Runloop和線程的關(guān)系:一個(gè)Runloop對應(yīng)著一條唯一的線程。

  • 2.Runloop的創(chuàng)建:主線程Runloop已經(jīng)創(chuàng)建好了余佛,子線程的runloop需要手動(dòng)創(chuàng)建柠新。

  • 3.Runloop的生命周期:在第一次獲取時(shí)創(chuàng)建,在線程結(jié)束時(shí)銷毀辉巡。

參考鏈接:都在說RunLoop...... 到底什么是RunLoop恨憎?

2. runloop的mode是用來做什么的?有幾種mode郊楣?

iOS有五種模式憔恳,

  • 其中UIInitializationRunLoopModel應(yīng)用程序啟動(dòng)時(shí)會(huì)使用,啟動(dòng)完成后將不再使用净蚤;
  • GSEventReceiveRunLoopMode這個(gè)是接受系統(tǒng)內(nèi)部的Model钥组,通常做不到。
  • 還有UITrackingRunLoopMode今瀑、NSDefaultRunLoopMode程梦、NSRunLoopCommonModes三種模式是我們通常用到的,

下文中會(huì)詳細(xì)講解橘荠,其中NSRunLoopCommonModes是一個(gè)占位符屿附,NSDefaultRunLoopMode和UITrackingRunLoopMode都會(huì)綁定這個(gè)占位符。

→ UITrackingRunLoopMode : (優(yōu)先切換!!)這個(gè)模式就是當(dāng)UI事件交互的時(shí)候Runloop切換到的模式@健D昧谩!
場景:這一模式優(yōu)先級最高如蚜,當(dāng)UI事件交互的時(shí)候压恒,都會(huì)優(yōu)先切換到這一模式。

→ NSDefaultRunLoopMode :Runloop的默認(rèn)模式错邦!只要有事件就處理探赫!
場景:默認(rèn)模式,只要有事件就會(huì)自動(dòng)切換到此模式撬呢。

→ NSRunLoopCommonModes :占位符!!(在默認(rèn)下和UITrackingRunLoopMode下B追汀)
場景:這個(gè)主要用在添加一個(gè)NSTimer到RunLoop中。是一個(gè)tag,本質(zhì)上不是一個(gè)Mode,默認(rèn)NSDefaultRunLoopMode和 NSTrackingRunLoopMode都綁定這個(gè)tag。

參考:《招聘一個(gè)靠譜的iOS》面試題參考答案(下)

3. 為什么把NSTimer對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運(yùn)行循環(huán)以后毛仪,滑動(dòng)scrollview的時(shí)候NSTimer卻不動(dòng)了搁嗓?

RunLoop只能運(yùn)行在一種mode下,如果要換mode箱靴,當(dāng)前的loop也需要停下重啟成新的腺逛。利用這個(gè)機(jī)制,ScrollView滾動(dòng)過程中NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的mode會(huì)切換到UITrackingRunLoopMode來保證ScrollView的流暢滑動(dòng):只能在NSDefaultRunLoopMode模式下處理的事件會(huì)影響scrllView的滑動(dòng)衡怀。

如果我們把一個(gè)NSTimer對象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運(yùn)行循環(huán)中的時(shí)候, ScrollView滾動(dòng)過程中會(huì)因?yàn)閙ode的切換棍矛,而導(dǎo)致NSTimer將不再被調(diào)度。

同時(shí)因?yàn)閙ode還是可定制的抛杨,所以:

Timer計(jì)時(shí)會(huì)被scrollView的滑動(dòng)影響的問題可以通過將timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)來解決够委。

4. 蘋果是如何實(shí)現(xiàn)Autorelease Pool的?

autoreleasepool以一個(gè)隊(duì)列數(shù)組的形式實(shí)現(xiàn),主要通過下列三個(gè)函數(shù)完成.

objc_autoreleasepoolPush

objc_autoreleasepoolPop

objc_aurorelease

看函數(shù)名就可以知道怖现,對autorelease分別執(zhí)行push茁帽,和pop操作。銷毀對象時(shí)執(zhí)行release操作真竖。

類結(jié)構(gòu)

1. isa指針脐雪?(對象的isa,類對象的isa恢共,元類的isa都要說)

               nil  
                |
(NSObject)根類對象 isa --> 根類元類 isa
                |             | |
            父類對象 isa --> 父類元類 isa
                |             | 

實(shí)例對象 isa --> 類對象 isa --> 元類 isa

2. 類方法和實(shí)例方法有什么區(qū)別战秋?

  • 1.類方法以+號開頭 對象方法以-號開頭
  • 2.類方法直接 [類名 類方法名]調(diào)用 對象方法要?jiǎng)?chuàng)建對象后 [對象名 對象方法]調(diào)用
  • 3.類方法不能訪問實(shí)例變量 對象方法可以訪問實(shí)例變量
  • 4.類方法只能由類來調(diào)用 對象方法只能用對象來調(diào)用

3. 介紹一下分類,能用分類做什么讨韭?內(nèi)部是如何實(shí)現(xiàn)的脂信?它為什么會(huì)覆蓋掉原來的方法?

類別(Category)主要有3個(gè)作用:

  • 將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中透硝。
  • 創(chuàng)建對私有方法的前向引用狰闪。
  • 向?qū)ο筇砑臃钦絽f(xié)議。

聲明:@interface 類名(分類名稱) @end
實(shí)現(xiàn):@implementation 類名(分類名稱) @end

注意:

  • (1)在分類只能增加方法,不能增加成員變量濒生,如果要增加成員變量的話該考慮用繼承去實(shí)現(xiàn)

  • (2)在分類實(shí)現(xiàn)方法中可以訪問類中的成員變量但是不能訪問類中的屬性@property

  • (3)在分類中可以重新實(shí)現(xiàn)原類中的方法埋泵,但會(huì)將原類中的方法覆蓋而失效。因?yàn)樵趫?zhí)行對象成員方法的時(shí)候會(huì)優(yōu)先去分類中查找罪治,然后再去原類中去查找丽声,最后去父類中去查找

  • (4)如果一個(gè)類有多個(gè)分類,而且分類中有同名的方法那么最后編譯的分類會(huì)將前面編譯的分類覆蓋而執(zhí)行輸出

4. 運(yùn)行時(shí)能增加成員變量么觉义?能增加屬性么雁社?如果能,如何增加晒骇?如果不能霉撵,為什么磺浙?

①給NSObject添加分類,在分類中添加屬性徒坡。問題:@property在分類中作用:僅僅是生成get,set方法聲明撕氧,不會(huì)生成get,set方法實(shí)現(xiàn)和下劃線成員屬性,所以要在.m文件實(shí)現(xiàn)setter/getter方法崭参,用static保存下滑線屬性呵曹,這樣一來,當(dāng)對象銷毀時(shí)何暮,屬性無法銷毀
②用runtime動(dòng)態(tài)添加屬性:本質(zhì)是讓屬性與某個(gè)對象產(chǎn)生一段關(guān)聯(lián)
使用場景:給系統(tǒng)的類添加屬性時(shí)

分類 Category 可以添加屬性,不能添加成員變量。分類中是可以為一個(gè)類添加屬性的铐殃,但是一定做不到添加成員變量海洼,Property是Property,Ivar是Ivar富腊。分類里面不能添加Ivar是因?yàn)榉诸惐旧聿⒉皇且粋€(gè)真正的類坏逢,它并沒有自己的ISA。

在Objective-C提供的runtime函數(shù)中赘被,確實(shí)有一個(gè)class_addIvar()函數(shù)用于給類添加成員變量是整,但是閱讀過蘋果的官方文檔的人應(yīng)該會(huì)看到:

This function may only be called after objc_allocateClassPair 
and before objc_registerClassPair.
Adding an instance variable to an existing class is not supported.

大概的意思說,這個(gè)函數(shù)只能在“構(gòu)建一個(gè)類的過程中”調(diào)用民假。一旦完成類定義浮入,就不能再添加成員變量了。經(jīng)過編譯的類在程序啟動(dòng)后就被runtime加載羊异,沒有機(jī)會(huì)調(diào)用addIvar事秀。程序在運(yùn)行時(shí)動(dòng)態(tài)構(gòu)建的類需要在調(diào)用objc_registerClassPair之后才可以被使用,同樣沒有機(jī)會(huì)再添加成員變量野舶。

因?yàn)榉椒ê蛯傩圆⒉弧皩儆凇鳖悓?shí)例易迹,而成員變量“屬于”類實(shí)例。我們所說的“類實(shí)例”概念平道,指的是一塊內(nèi)存區(qū)域睹欲,包含了isa指針和所有的成員變量。所以假如允許動(dòng)態(tài)修改類成員變量布局一屋,已經(jīng)創(chuàng)建出的類實(shí)例就不符合類定義了窘疮,變成了無效對象。但方法定義是在objc_class中管理的陆淀,不管如何增刪類方法考余,都不影響類實(shí)例的內(nèi)存布局,已經(jīng)創(chuàng)建出的類實(shí)例仍然可正常使用轧苫。

然而如果在運(yùn)行時(shí)動(dòng)態(tài)生成一個(gè)類楚堤,就可以為其添加成員變量和方法疫蔓。

5. objc中向一個(gè)nil對象發(fā)送消息將會(huì)發(fā)生什么?(返回值是對象身冬,是標(biāo)量衅胀,結(jié)構(gòu)體)

? 如果一個(gè)方法返回值是一個(gè)對象,那么發(fā)送給nil的消息將返回0(nil)酥筝。例如:Person * motherInlaw = [ aPerson spouse] mother]; 如果spouse對象為nil滚躯,那么發(fā)送給nil的消息mother也將返回nil。
? 如果方法返回值為指針類型嘿歌,其指針大小為小于或者等于sizeof(void*)掸掏,float,double宙帝,long double 或者long long的整型標(biāo)量丧凤,發(fā)送給nil的消息將返回0。
? 如果方法返回值為結(jié)構(gòu)體步脓,正如在《Mac OS X ABI 函數(shù)調(diào)用指南》愿待,發(fā)送給nil的消息將返回0。結(jié)構(gòu)體中各個(gè)字段的值將都是0靴患。其他的結(jié)構(gòu)體數(shù)據(jù)類型將不是用0填充的仍侥。
? 如果方法的返回值不是上述提到的幾種情況,那么發(fā)送給nil的消息的返回值將是未定義的鸳君。

參考鏈接:iOS面試題總結(jié)

相關(guān)閱讀:

1农渊、iOS 面試題 --- 基礎(chǔ)部分
2、iOS 面試題 --- 中級篇 Block
3相嵌、iOS 面試題 --- 中級篇 Runtime
4腿时、iOS 面試題 --- 高級篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饭宾,隨后出現(xiàn)的幾起案子批糟,更是在濱河造成了極大的恐慌,老刑警劉巖看铆,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徽鼎,死亡現(xiàn)場離奇詭異,居然都是意外死亡弹惦,警方通過查閱死者的電腦和手機(jī)否淤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棠隐,“玉大人石抡,你說我怎么就攤上這事≈螅” “怎么了啰扛?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵嚎京,是天一觀的道長。 經(jīng)常有香客問我隐解,道長鞍帝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任煞茫,我火速辦了婚禮帕涌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘续徽。我一直安慰自己蚓曼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布钦扭。 她就那樣靜靜地躺著辟躏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪土全。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天会涎,我揣著相機(jī)與錄音裹匙,去河邊找鬼。 笑死末秃,一個(gè)胖子當(dāng)著我的面吹牛概页,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播练慕,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼惰匙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铃将?” 一聲冷哼從身側(cè)響起项鬼,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劲阎,沒想到半個(gè)月后绘盟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悯仙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年龄毡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锡垄。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沦零,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出货岭,到底是詐尸還是另有隱情路操,我是刑警寧澤疾渴,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站寻拂,受9級特大地震影響程奠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祭钉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一瞄沙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慌核,春花似錦距境、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粟按,卻和暖如春诬滩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灭将。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工疼鸟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庙曙。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓空镜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捌朴。 傳聞我的和親對象是個(gè)殘疾皇子吴攒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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

  • 1. block的實(shí)質(zhì)是什么?一共有幾種block砂蔽?都是什么情況下生成的洼怔? block的實(shí)質(zhì)是什么? block本...
    赫子豐閱讀 2,667評論 1 21
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,093評論 1 32
  • runtime 和 runloop 作為一個(gè)程序員進(jìn)階是必須的察皇,也是非常重要的茴厉, 在面試過程中是經(jīng)常會(huì)被問到的, ...
    SOI閱讀 21,796評論 3 63
  • 面向?qū)ο蟮娜筇匦裕悍庋b什荣、繼承矾缓、多態(tài) OC內(nèi)存管理 _strong 引用計(jì)數(shù)器來控制對象的生命周期。 _weak...
    運(yùn)氣不夠技術(shù)湊閱讀 1,092評論 0 10
  • 天還未亮稻爬,一個(gè)小伙子行色匆匆嗜闻,孟師傅的車剛停下,他便立刻跳上車桅锄,迅速占據(jù)后座的角落旮瘩里琉雳。孟師傅透過后車鏡看到小伙...
    KKimmy閱讀 259評論 0 0