今天有幸去某知名視頻公司面試, 所以想用筆記下來整個過程, 方便自己對過往基礎知識的回顧和收集2016年編程行業的面試題(貌似2016已經剩下0.5/12).
一進去二話不說肯定是做筆試, 這次筆試是英文版技術題目, 都是比較基礎的東西, 不難.
接下來是兩個技術大牛VS菜雞的我. 問的問題我寫在下文.有的我寫了我的答案,有的由于篇幅和時間問題我就暫時先不寫答案,有的我想過后專門寫一個文章來聊聊.
我希望各位看官都能挑自己熟悉或者感興趣的問題在評論里寫上自己的答案. 因為每個人的語言組織和對一個問題的看法層面都不一樣. 也歡迎糾正我的錯誤. 集思廣益嘛.
UIView/runloop/runtime/動畫/多線程/數據庫
如何處理約束沖突問題?
答:
1.最普通的就是靠自己強大的邏輯能力來逐條約束檢查,以及看一下報錯信息, 報錯信息那里會說到哪幾個類(控件)的約束有問題.
2.巧用約束優先級priority. 當約束沖突時候系統會自動拋棄掉引起約束沖突的優先級比較低的那個約束來解決問題.所以我們逐個把約束的優先級設置低一些如998, 就可以排查出是哪個約束發生了沖突.
3.有時候明明檢查了約束是沒有問題的,卻還是報了約束沖突的錯誤, 不妨把autoresizingMask這個屬性設置為NO試一下, 可能有奇效.
當控件A相對于控件B添加了一個約束, 但是在程序運行過程中控件B會消失怎么辦?
答:
這個需要根據需求文檔來,既然可以知道控件B會消失, 那我的控件A可以不必相對于控件B來設計.
假如真的控件A必須相對控件B添加一個約束,而控件B可能消失, 那么我們可以給控件A再添加一個優先級比較低的約束,當相對于控件B的那條約束失效了之后, 就會執行這個優先級比較低的約束, 從而解決約束問題.
約束是怎么實現(添加)的?約束的優先級有幾個等級?
答:
1.可以在storyboard或者xib里面直接添加,這樣也是最直接方便的.
2.如果純代碼的話,可以使用友好度非常高的masonry框架.
約束是根據一個萬能公式來實現的: y = m * x + b
x, y 代表view的attribute, attribute可以分為left right top bottom leading trailing width height centerX centerY baseline m 是倍數, 即multiplier b 常數, 即 constant.
每一條約束都代表著上面這個公式.masonry的語句也是根據這個公式來設計的,所以非常直觀.
約束的優先級priority為0-1000直接, 0代表不會生效, 1000代表必須生效. 常用的等級有250(low), 750(high), 1000(required).
masonry里面有什么常用方法添加約束?如何進行約束更新?
答:
明白那個約束公式之后, masonry添加約束的語句非常通俗易懂, 如下
//y = m * x + d
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.xxx.equalTo(self.view).xxxxxxxx;
//更新約束
[self.view updateConstraintsIfNeeded];
//約束馬上生效
[self.view layoutIfNeed];
}
約束更新:
在storyboard或者xib里面可以直接選update constraints來更新約束.
純代碼用masonry來進行約束更新的話, 需要調用父控件的兩個方法(注意是父控件):1、updateConstraintsIfNeeded 2、layoutIfNeeded, 約束更新的內容需要寫入mas_updateConstraints中.
在我說到用collectionView代替scrollView來優化離屏渲染問題時候(iOS10以后系統有屬性可以優化了), 面試官問我什么是離屏渲染
答:
Off-Screen Rendering(離屏渲染), 顧名思義就是當view離開屏幕后還會被渲染.這涉及到GPU的屏幕渲染問題, 這樣會消耗性能.
離屏渲染機制我也不是很懂, 可以參考以下鏈接
關于離屏渲染的研究
為什么tableView在滾動時候廣告輪播圖不輪播了? 怎么解決這個問題?
答:
這是由于runloop的模式問題.輪播圖也就是定時器, 我們把定時器添加進runloop里面時候一般情況都是用NSDefaultRunLoopMode的, 而當tableView在滾動時候會切換成UITrackingRunLoop這個模式.所以在tableView在滾動時候定時器就會停止了工作. 解決辦法就是我們在tableView里面創建定時器NSTimer時候把這個定時器的添加進runloop的模式設置成UITrackingRunLoopMode即可.
這里想在說兩句NSTimer, NSTimer的創建方法有兩種,如下:
//創建NSTimer方式一 創建timer并自動把它以默認的模式添加進runloop
// NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(doNothing) userInfo:nil repeats:nil];
//創建NSTimer方式二 創建timer但是不會幫我們加進runloop, 需要我們手動添加進runloop, 但是這樣我們可以自己定義runloop模式
NSTimer *timer2 = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(doNothingAgain) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer2 forMode:UITrackingRunLoopMode];
更多的NSTimer的知識可以參考:
NSTimer的使用
深拷貝和淺拷貝?
答:
淺拷貝就是只拷貝內存地址,讓兩個對象共用一個內存地址, 訪問同一個內容, 這種類似我們桌面的快捷方式.
深拷貝就是拷貝內容,并且分配新的內存空間, 即兩個對象內容一樣,但是地址不一樣, 這種類似我們把一個文件拉進U盤里面.
你談一下runtime?什么時候用到?
答:
這個問題我想過后用一篇文章來聊聊.
你怎么做視頻這個功能?
答:
以后用一篇文章來聊聊音視頻問題.
你平時怎么做動畫的
答:
動畫分為UIView的動畫和核心動畫,還有一個比較常用的POP這個做動畫的框架.
核心動畫相對于UIView的動畫來說會流暢一點.
UIView動畫: 直接調用animation
[UIView animateWithDuration:2 animations:^{
/*
這里寫要改變的frame或者約束等,來實現動畫效果
*/
}
核心動畫Core Animation: 這個我想有空用一篇文章來聊聊.
最簡單的用CABasicAnimation/CAKeyframeAnimation這個類,三部曲完成簡單動畫(代碼略)
1.創建動畫 2.設置動畫屬性 3.把動畫添加到layer中
POP框架: 這個開源框架是來自Facebook的動畫引擎,它是獨立于核心動畫Core Animation的, 功能非常強大.該框架提供了API主要能處理4種動畫效果:
1.普通變換 2.帶有阻尼效果的 3.帶有彈簧效果的 4.自定義動畫
關于如何使用POP, 各位感興趣的可以自己去搜一下.
很累, 今天先更到這, 古白.