《招一個(gè)靠譜的iOS》31-35

本人參考GitHub《招聘一個(gè)靠譜的iOS》面試題參考答案(下)
31. runloop的mode作用是什么?
32. 以+ scheduledTimerWithTimeInterval...的方式觸發(fā)的timer垢夹,在滑動(dòng)頁(yè)面上的列表時(shí)感昼,timer會(huì)暫定回調(diào),為什么蚜锨?如何解決?
33. 猜想runloop內(nèi)部是如何實(shí)現(xiàn)的?
34. objc使用什么機(jī)制管理對(duì)象內(nèi)存债查?
35. ARC通過(guò)什么方式幫助開(kāi)發(fā)者管理內(nèi)存?

31. runloop的mode作用是什么瓜挽?

mode主要是用來(lái)指定事件在運(yùn)行循環(huán)中的優(yōu)先級(jí)盹廷,分為4個(gè)狀態(tài):

(1)NSDefaultRunLoopMode(kCFRunLoopDefaultMode):Run的默認(rèn)Mode,通常主線(xiàn)程在這個(gè)mode下運(yùn)行久橙。
(2)UITrackingRunLoopMode:界面追蹤ode俄占,用于UIScrollView追蹤,觸摸滑動(dòng)淆衷,保證界面不受其他Mode影響
(3)UIInitializationRunLoopMode:在剛啟動(dòng)APP時(shí)進(jìn)入的第一個(gè)Mode缸榄,啟動(dòng)完成后就不再使用。(這個(gè)模式主要是蘋(píng)果在用祝拯,開(kāi)發(fā)者用不到)
(4)GSEventReceiveRunLoopMode:接受系統(tǒng)事件的內(nèi)部Mode(繪圖事件)甚带,通常開(kāi)發(fā)者用不到。
(5)NSRunLoopCommonModes(kCFRunLoopCommonModes):這是一個(gè)占位Mode佳头,不是一個(gè)真正的Mode鹰贵。一個(gè)模式可以被標(biāo)記為NSRunLoopCommonModes。

默認(rèn)情況下康嘉,NSDefaultRunLoopMode和UITrackingRunLoopMode被標(biāo)記為NSRunLoopCommonModes碉输,RunLoop在這個(gè)模式下運(yùn)行,則表示RunLoop可以同時(shí)執(zhí)行在NSDefaultRunLoopMode和UITrackingRunLoopMode兩個(gè)模式下亭珍。
應(yīng)用場(chǎng)景舉例:
主線(xiàn)程的RunLoop里有兩個(gè)預(yù)置的Mode:kCFRunLoopDefaultMode和UITrackingRunLoopMode敷钾。這兩個(gè)Mode都已經(jīng)被標(biāo)記為“Common”屬性。DefaultMode是APP平時(shí)所處的狀態(tài)块蚌,TrackingRunLoopMode是追蹤ScrollView滑動(dòng)時(shí)的狀態(tài)闰非。當(dāng)你創(chuàng)建一個(gè)Timer并加到DefaultMode時(shí),Timer會(huì)得到重復(fù)回調(diào)峭范,但此時(shí)滑動(dòng)一個(gè)TableView時(shí)财松,RunLoop會(huì)將mode切換為T(mén)rackingRunLoopMode,這時(shí)Timer就不會(huì)被回調(diào),并且也不會(huì)影響滑動(dòng)操作辆毡。
蘋(píng)果公開(kāi)提供的Mode有兩個(gè):
(1)NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
(2)NSRunLoopCommonModes(kCFRunLoopCommonModes)

32. 以+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block;的方式觸發(fā)的timer菜秦,在滑動(dòng)頁(yè)面上的列表時(shí),timer會(huì)暫筒耙矗回調(diào)球昨,為什么?如何解決眨攘?

RunLoop只能運(yùn)行在一種Mode下主慰,如果要換Mode,當(dāng)前的loop也需需要暫停下重啟成新的鲫售。利用這個(gè)機(jī)制共螺,ScrollView滾動(dòng)過(guò)程中NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的mode會(huì)切換到UITrackingRunLoopMode來(lái)保證ScrollView的流暢滑動(dòng)。
因此情竹,如果我們把一個(gè)NSTimer對(duì)象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運(yùn)行循環(huán)中的時(shí)候藐不,ScrollView滾動(dòng)過(guò)程中會(huì)因?yàn)镸ode的切換,而導(dǎo)致NSTimer將不再被調(diào)度秦效。
Timer計(jì)時(shí)會(huì)被ScrollView的滑動(dòng)影響的問(wèn)題可以通過(guò)將Timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)來(lái)解決雏蛮。

33. 猜想RunLoop內(nèi)部是如何實(shí)現(xiàn)的?

一般來(lái)講阱州,一個(gè)線(xiàn)程一次只能執(zhí)行一個(gè)任務(wù)挑秉,執(zhí)行完成后線(xiàn)程就會(huì)退出。如果需要一個(gè)機(jī)制贡耽,讓線(xiàn)程能隨時(shí)處理事件但不退出衷模,通常的代碼邏輯是這樣的:

function loop()
{
    initialize();
    do {
        var message = get_next_message();
        process_message(message);
    } while(message != quit);
}

或者使用偽代碼來(lái)展示下:

int main (int argc, char *argv[])
{
    // 程序一直運(yùn)行狀態(tài)
    while (AppIsRunning)
    {
        // 睡眠狀態(tài)鹊汛,等待喚醒事件
        id whoWakesMe = SleepForWakingUp();
        //  得到喚醒事件
        id event = GetEvent(whoWakesMe);
        // 開(kāi)始處理事件
        HandleEvent(event);
    }
    return 0;
}

34. objc使用什么機(jī)制管理對(duì)象內(nèi)存蒲赂?

objc通過(guò)retainCount(引用計(jì)數(shù)器)的機(jī)制來(lái)決定對(duì)象是否需要釋放。每次runloop的時(shí)候都會(huì)檢查對(duì)象的retainCount刁憋,如果retainCount為0滥嘴,說(shuō)明該對(duì)象沒(méi)有地方繼續(xù)使用了,可以釋放掉了至耻。

35. ARC通過(guò)什么方式幫助開(kāi)發(fā)者管理內(nèi)存若皱?

ARC相對(duì)于MRC,不是在編譯時(shí)添加retain/release/autorelease這么簡(jiǎn)單尘颓。應(yīng)該是編譯器和運(yùn)行期兩部分共同幫助開(kāi)發(fā)者管理內(nèi)存走触。
在編譯器,ARC用的是更底層的C接口實(shí)現(xiàn)的retain/release/autorelease疤苹,這樣做性能更好互广,也是為什么不能在A(yíng)RC環(huán)境下手動(dòng)retain/release/autorelease,同時(shí)對(duì)同一上下文的同一對(duì)象的成對(duì)retain/release操作進(jìn)行優(yōu)化(即忽略不必要的操作);ARC也包含運(yùn)行期的組件惫皱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末像樊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子旅敷,更是在濱河造成了極大的恐慌生棍,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媳谁,死亡現(xiàn)場(chǎng)離奇詭異涂滴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晴音,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)氢妈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人段多,你說(shuō)我怎么就攤上這事首量。” “怎么了进苍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵加缘,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我觉啊,道長(zhǎng)拣宏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任杠人,我火速辦了婚禮勋乾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗡善。我一直安慰自己辑莫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布罩引。 她就那樣靜靜地躺著各吨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袁铐。 梳的紋絲不亂的頭發(fā)上揭蜒,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音剔桨,去河邊找鬼屉更。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洒缀,可吹牛的內(nèi)容都是我干的瑰谜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼似舵!你這毒婦竟也來(lái)了脚猾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砚哗,失蹤者是張志新(化名)和其女友劉穎龙助,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛛芥,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡提鸟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仅淑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片称勋。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涯竟,靈堂內(nèi)的尸體忽然破棺而出赡鲜,到底是詐尸還是另有隱情,我是刑警寧澤庐船,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布银酬,位于F島的核電站,受9級(jí)特大地震影響筐钟,放射性物質(zhì)發(fā)生泄漏揩瞪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一篓冲、第九天 我趴在偏房一處隱蔽的房頂上張望李破。 院中可真熱鬧,春花似錦壹将、人聲如沸嗤攻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屯曹。三九已至,卻和暖如春惊畏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背密任。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工颜启, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浪讳。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓缰盏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子口猜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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