一攒射。送分題
1.冒泡排序
二。拓展題
1.內(nèi)存管理 側(cè)重點(diǎn)是mrc下的內(nèi)存管理機(jī)制
MRC,即Manual Reference Counting,在MRC下,我們根據(jù)對(duì)象的引用計(jì)數(shù)器來(lái)進(jìn)行內(nèi)存管理的.每個(gè)對(duì)象剛被創(chuàng)建的時(shí)候,默認(rèn)的引用計(jì)數(shù)器為1,當(dāng)引用計(jì)數(shù)器為0的時(shí)候,該對(duì)象就被銷毀.我們可以把retain,alloc,new,copy看做是對(duì)引用計(jì)數(shù)+1操作,需要在適當(dāng)?shù)奈恢谜{(diào)用release或者autorelease使其-1保證沒有內(nèi)存泄漏. 內(nèi)存管理的原則,誰(shuí)創(chuàng)建,誰(shuí)release;誰(shuí)retain,誰(shuí)release.
2.多線程 側(cè)重點(diǎn)是gcd中同步異步還有queue的類型 dispatch_group
在線程中做線程安全用到的方式 同步鎖等等
一、術(shù)語(yǔ):同步、異步、并發(fā)耕餐、串行
1、同步和異步?jīng)Q定了要不要開啟新的線程
同步:在當(dāng)前線程執(zhí)行,不開啟新線程
dispatch_sync辟狈,同步操作肠缔,派發(fā)到任何隊(duì)列,都不會(huì)開啟新線程哼转。
異步:在新的線程中執(zhí)行任務(wù)明未,具備開啟新線程的能力
dispatch_async,異步操作壹蔓,會(huì)創(chuàng)建一個(gè)線程亚隅。如果派發(fā)到主線程中,則會(huì)在主線程中執(zhí)行庶溶。
2煮纵、并發(fā)和串行決定了任務(wù)的執(zhí)行方式
并發(fā)隊(duì)列 :多個(gè)任務(wù)并發(fā)(同時(shí))執(zhí)行
串行隊(duì)列 :一個(gè)任務(wù)執(zhí)行完畢后,再執(zhí)行下一個(gè)任務(wù)
特殊隊(duì)列主隊(duì)列 : 用來(lái)執(zhí)行主線程上的操作任務(wù)
3.runloop 側(cè)重點(diǎn)是runloop的幾種類型以及與NSTimer的結(jié)合
4.跟音視頻的結(jié)合偏螺,如何實(shí)現(xiàn)一個(gè)視頻播放進(jìn)度精準(zhǔn)的播放時(shí)間顯示行疏?
- 視頻時(shí)間戳
pts = inc++ *(1000/fps); 其中inc是一個(gè)靜態(tài)的,初始值為0套像,每次打完時(shí)間戳inc加1.
在ffmpeg酿联,中的代碼為
pkt.pts= m_nVideoTimeStamp++ * (m_VCtx->time_base.num * 1000 / m_VCtx->time_base.den)
- 音頻時(shí)間戳
pts = inc++ * (frame_size * 1000 / sample_rate)
在ffmpeg中的代碼為
pkt.pts= m_nAudioTimeStamp++ * (m_ACtx->frame_size * 1000 / m_ACtx->sample_rate);
5.如何實(shí)現(xiàn)一個(gè)具有緩存上限、緩存清除的內(nèi)存緩存模型
內(nèi)存中緩存
內(nèi)存中緩存時(shí)夺巩,使用一個(gè)NSMutabledictionary存儲(chǔ)key-value值贞让,
當(dāng),存緩存時(shí)柳譬,使用 setObject:forKey的方法存對(duì)象喳张,讀取時(shí)使用
objectForKey:讀取對(duì)象
磁盤中緩存
內(nèi)存中存儲(chǔ)了一個(gè)key值的value之后,需要在磁盤中保存此份對(duì)象美澳。首先將該對(duì)象通過(guò)歸檔轉(zhuǎn)變成一個(gè)NSData销部,然后根據(jù)關(guān)鍵字創(chuàng)建磁盤中的文件,將該數(shù)據(jù)NSData寫入該文件中即可制跟。
對(duì)于在NSMutableiDictionary中未曾讀到對(duì)象時(shí)舅桩,可以根據(jù)俄key索引本地磁盤,如果存在該文件雨膨,那么將該文件通過(guò)解檔還原成對(duì)象擂涛,同時(shí)在NSMutabledictionary中存儲(chǔ)一次該對(duì)象即可。
6.導(dǎo)致內(nèi)存crash的問題都有哪些類型
一.訪問了一個(gè)已經(jīng)被釋放的對(duì)象
二聊记、訪問數(shù)組類對(duì)象越界或插入了空對(duì)象
三撒妈、訪問了不存在的方法
四、字節(jié)對(duì)齊
五甥雕、堆棧溢出
六踩身、多線程并發(fā)操作
7.如何獲取當(dāng)前設(shè)備的幀率
CADisplayLink是一個(gè)定時(shí)器,是一個(gè)刷新頻率和屏幕刷新率相同的定時(shí)器社露。
我們可以通過(guò)這個(gè)來(lái)計(jì)算當(dāng)前幀數(shù)
8.如何監(jiān)測(cè)當(dāng)前頁(yè)面的卡頓
主要思路:通過(guò)監(jiān)測(cè)Runloop的kCFRunLoopAfterWaiting挟阻,用一個(gè)子線程去檢查,一次循環(huán)是否時(shí)間太長(zhǎng)峭弟。其中主要涉及到了runloop的原理附鸽。關(guān)于整個(gè)原理:深入理解RunLoop講解的比較仔細(xì)。
三瞒瘸。技術(shù)題
1.Runtime里面坷备,isa指針的指向問題?
IMP指針是指向?qū)崿F(xiàn)函數(shù)的指針,通過(guò)SEL取得IMP,objc_msgSend來(lái)執(zhí)行實(shí)現(xiàn)方法
2.Runtime里面SEL和IMP的區(qū)別是什么情臭?
3.UITableView性能優(yōu)化省撑,尤其是滑動(dòng)時(shí)赌蔑,引申出GPU與CPU的一些討論。
SEL:類成員的方法指針竟秫,不同于C中的函數(shù)指針娃惯,SEL只是一個(gè)編號(hào)。
IMP: 函數(shù)指針肥败,指向我們定義的函數(shù)
4.UIView與CALayer的區(qū)別趾浅?
1.首先UIView可以響應(yīng)事件,Layer不可以.
2.View和CALayer的Frame映射及View如何創(chuàng)建CALayer.
3.UIView主要是對(duì)顯示內(nèi)容的管理而 CALayer 主要側(cè)重顯示內(nèi)容的繪制馒稍。
4.在做 iOS 動(dòng)畫的時(shí)候皿哨,修改非 RootLayer的屬性(譬如位置、背景色等)會(huì)默認(rèn)產(chǎn)生隱式動(dòng)畫纽谒,而修改UIView則不會(huì)证膨。
5.RunLoop的幾種Mode,子線程有runloop么佛舱?
3種
有
6.多線程的同步機(jī)制椎例,GCD除了信號(hào)量,還有哪種同步機(jī)制请祖。引申出dispatch_barrier_async订歪。
我們使用GCD的時(shí)候如何讓線程同步,目前我能想到的就三種
1.dispatch_group
2.dispatch_barrier
3.dispatch_semaphore
dispatch_group_async(group, queue, ^{
NSLog(@"%i",i);
sleep(2);
// 每次發(fā)送信號(hào)則semaphore會(huì)+1肆捕,
dispatch_semaphore_signal(semaphore);
});
7.NSTimer在不同runloop里面的作用刷晋?
NSTimer添加到Runloop中,但是不運(yùn)行
在iOS多線程中慎陵,每一個(gè)線程都有一個(gè)Runloop眼虱,但是只有主線程的Runloop默認(rèn)是打開的,其他子線程也就是我們創(chuàng)建的線程的Runloop默認(rèn)是關(guān)閉的席纽,需要我們手動(dòng)運(yùn)行捏悬。
我們可以通過(guò)[NSRunLoop currentRunLoop]來(lái)獲得當(dāng)前線程的Runloop,并且調(diào)用[runloop addTimer:timer forMode:NSDefaultRunLoopMode]方法將定時(shí)器添加到Runloop中润梯,最后一定不要忘記調(diào)用Runloop的run方法將當(dāng)前Runloop開啟过牙,否則NSTimer永遠(yuǎn)也不會(huì)運(yùn)行。
8.觸摸事件響應(yīng)鏈和UIResponder
在使用App過(guò)程中纺铭,需要響應(yīng)各種事件寇钉,在IOS中不是所有對(duì)象都可以響應(yīng)事件,只有繼承了UIResponder的對(duì)象才能接收并處理事件舶赔。我們稱之為“響應(yīng)者對(duì)象”扫倡,
UIApplication、UIViewController竟纳、UIView都繼承自UIResponder撵溃,因此它們都是響應(yīng)者對(duì)象疚鲤,都能夠接收并處理事件
9.autorelease pool是什么?簡(jiǎn)述原理
10.KVO的內(nèi)部實(shí)現(xiàn)征懈?
kvo石咬,全稱Key-Value Observing,它提供了一種方法,當(dāng)對(duì)象某個(gè)屬性發(fā)生改變時(shí)卖哎,允許監(jiān)聽該屬性值變化的對(duì)象可以接受到通知,然后通過(guò)kvo的方法響應(yīng)一些操作删性。
在 Objective-C 中有兩種使用鍵值觀察的方式:手動(dòng)或自動(dòng)亏娜,此外還支持注冊(cè)依賴鍵(即一個(gè)鍵依賴于其他鍵,其他鍵的變化也會(huì)作用到該鍵)