總結一下在金山面試ios開發時問到的問題
前幾天去了金山的wps部門面試ios的開發實習生,雖然好像是勉強過了二面,但好像還是gg了,總結一下面試時問到的問題
1.如何在不改動項目原有的代碼前提下,使項目中每個Controller的viewDidLoad方法都輸出一句話?(不能在原有的文件添加刪除或改掉代碼,但可以新建文件寫代碼)
2.除了使用view.layer.cornerRadius來設置圓角以外,還有什麼其它方法設置圓角,使用view.layer.cornerRadius有什麼壞處?
3.view和layer有什麼區別?
4.block有幾種類型?分別是?
5.block中如何防止循環引用?為什麼在block中要加入strong typeof?
6.利用cocoapods管理第三方庫,是如何實現讀取pod工程中的文件的?
7.說說arc的工作原理,他是如何管理對象或變數的釋放?
8.說說ios中多線程有哪幾種實現方法?談談對gcd的理解?
我就記得這麼多了,有些問題忘了,還有些是我的項目中具體的問題。
答案:
1.先創建一個新的文件實現一個方法輸出一句話,然後利用runtime機制把uiview中的viewDidLoad方法與新建的方法進行交換,具體實現看這篇文章
2.總共3種方法
1.通過設置layer.cornerRadius 2.使用貝塞爾曲線UIBezierPath和Core Graphics框架畫出一個圓角 3.使用CAShapeLayer和UIBezierPath設置圓角
具體實現看這篇文章
3.主要這幾點
1.每個 UIView 內部都有一個 CALayer 在背後提供內容的繪製和顯示,並且 UIView 的尺寸樣式都由內部的 Layer 所提供。兩者都有樹狀層級結構,layer 內部有 SubLayers,View 內部有 SubViews.但是 Layer 比 View 多了個AnchorPoint 2.在 View顯示的時候,UIView 做為 Layer 的 CALayerDelegate,View 的顯示內容由內部的 CALayer 的 display 3.CALayer 是默認修改屬性支持隱式動畫的,在給 UIView 的 Layer 做動畫的時候,View 作為 Layer 的代理,Layer 通過 actionForLayer:forKey:向 View請求相應的 action(動畫行為) 4.layer 內部維護著三分 layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在做 iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實是提供 View的modelLayer 5.兩者最明顯的區別是 View可以接受並處理事件,而 Layer 不可以
(最重點)兩者最明顯的區別是 View可以接受並處理事件,而 Layer 不可以
具體看這裡
4. 三種
1._NSConcreteGlobalBlock 全局靜態 2._NSConcreteStackBlock 保存在棧中,出函數作用域就銷毀 3._NSConcreteMallocBlock 保存在堆中,retainCount == 0銷毀
5.
在調用block前使用weak typeof (self) weakSelf = self;即可(即用一個弱指針指向self,這樣的話在block中調用一次weakSelf這個弱指針就會自動釋放)
當在block中要多次調用self時就使用 strong __typeof(weakself)strongSelf = weakself;(即再用一個強指針指向weakself這個弱指針,防止調用一次後就馬上釋放)6.利用workspace,具體看這篇文章
7.Cocoa採用了引用計數(retain count)機制,當一個對象的retain count=0時,在Mrc(即非arc)中時需要手動添加 [xxx release] ; 這樣一句代碼釋放對象,但arc中這個系統已經默認幫你加上了,只要retain count=0就自動調用,當然過程還要複雜點,具體體看這篇文章
8. 四種(當時答了三種orz)
1.Pthreads2.NSThread3.GCD4.NSOperation & NSOperationQueue
關於gcd的話我當時大概講了一下隊列同步非同步這些,當時也講得並不完整,畢竟有些東西緊張起來還是忘了…………
具體的話看這裡雖然這次面試並不成功,但至少吸取了點經驗吧~
另外…………二本的我求一份ios或unity的實習orz……謝謝orz
推薦閱讀: