iOS面试题 第一天
今天上午,下午分別面試了兩家公司。上午是一家互聯網公司,氣氛還比較好,是我比較喜歡的。技術這塊是直接機試,主要是給了些BUG讓我修復,整個過程還算順利。下午去了一家大型的證券公司。整理技術問題如下:
1. UIView的生命周期是什么樣的,執行順序是怎么樣的?
init —— loadView —— viewDidLoad ——?viewWillAppear?—— viewWillDisappear —— viewDidUnload —— dealloc.
2. UIViewController在什么時候會加載UIView,換句話說,技術上在哪個時間點會執行loadView。
這個問題我沒有答上來,原來寫程序只知道是在addSubview或pushViewController的時候,程序就會執行loadView。于是覺得,loadView是在UIView要被顯示出來之前執行的。后來了解到,這種說法其實有點本末倒至了。是因為執行了loadView,所以UIView才會被顯示出來。正確的答案是,在view對象第一次被訪問的時候,會執行loadView。
3. UITableView的執行流程是怎么樣的?
省去UIView相關的不說,就UITableView來說,每個UITableView都會有一個delegate,delegate指向的對象會接受UITableView的委托從而實現一系列的方法。其主要的幾個方法執行順序如下:
numberOfSectionsInTableView——numberOfRowsInSection——titleForHeaderInSection——cellForRowAtIndexPath
4. UITableView是怎樣實現Cell的重用的?
UITableView中有一個數組,visibleCells,保存可視的cell。假設一屏可以顯示10個cell。當向上滑動tableView時,第1個cell移出可視范圍,同時第11個cell顯示出來。如果cell是通過dequeueReusableCellWithIdentifier方法得到的,其本質上,是將第一個cell放到第11個的位置,然后內容按照indexPath的要求重繪出來,但并不會清除cell中的subView。這也是為什么在cell中添加了UILabel后,上下拉動時,會有重影(多個UILabel重疊)。要避免此情況,Apple推薦自定義UITableViewCell。如果不自定義cell的話,可以為不同indexPath的cell定義不同的cellIdentifier。或是每次都通過遍歷subview刪除所有子視圖,再重新addSubView,等等。
5. 如何設計一個可變高度(根據內容自適應高度)的UITableViewCell?
這個真是讓人蛋疼,我原來確實沒有遇到過這樣的需求,做法都是定高,然后文字內容多了,直接省略,引導用戶點擊進入下一層觀看。當時間歇性腦殘的說了句不知道,后來想想,真的很簡單:
我們在configureCell的時候,通過sizeWithFont方法獲取UILabel的CGSize,從而得出自定義cell的高度,然后在heightForRowAtIndexPath里進行對應的賦值就可以了。-_-!!!
6. 談談內存管理機制。
這個大家基本都了解,Objective-C是通過retainCount來決定是否回收內存。每個NSObject都有一個計數器retainCount,當alloc時,retainCount的值為1,并且每次retain都會加1,release會減1,當retainCount為0的時候,內存會被釋放。由此引發了另一個問題,NSString通過stringWithString創建的對象,他的作用域是什么呢?什么時候會被釋放?我覺得,通過上述靜態方法創建的對象約等于,[[[NSString alloc] initWithString:@”"] autorelease]; 也就是說,他是一個autorelease的對象,被放入NSAutoreleasePool中。系統會為每個RunLoop建立一個NSAutoreleasePool,當RunLoop結束時,autoreleasePool里的內存將被釋放。
注:答題時我混淆了閉包和RunLoop的概念,把RunLoop說成了閉包。后面講Block會談到。
7. 談談對block的了解。
block才是閉包。閉包是一個函數或指向函數的指針,再加上其外部變量(也叫自由變量)。block有三種,NSConcreteGlobal, NSConcreteStack, NSConcreteMalloc。block是可以訪問block外部的變量的。
NSConcreteGlobal: 就像一個全局函數一樣,從頭到尾待在那,始終是可用的。當Block中沒有引用外部變量時,block為global類型的。
NSConcreteStack: 保存在棧中的block,block執行完后內存會被釋放掉。當block引用了外部變量時,block為stack類型的。
NSConcreteMallock: 保存在堆中的block,block為引用記數為0時,內存會被釋放掉。當block執行copy時,block會從棧中復制到堆中。
以上都針對非ARC環境而言,如果在ARC環境下,引用外部變量的block會自動保存在堆中,無需copy。
目前整理的就這么多,KVO,Delegate等設計模式今天沒談到。還有7個公司的面試等著哥呢,海量投簡歷的孩紙傷不起啊。我會持續更新。
轉載于:https://www.cnblogs.com/lingzhao/p/3731272.html
總結
以上是生活随笔為你收集整理的iOS面试题 第一天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS imageNamed 的缓存问题
- 下一篇: JavaScript网站设计实践(五)编