中高級iOS大廠面試寶典!

引言

過年以後相信有一部分的人,早已磨刀霍霍向大廠。勢必要大展拳腳,必將在大廠內創出一片天地。可是,想必你們都知道:最近幾年的最嚴重的互聯網寒冬來臨,各位兄弟都會說「江湖再見」。耳邊老是充刺着流言蜚語,這個地方裁人了,這個地方縮減HC。弄得人心慌慌。年後將是一片血雨腥風,程序界的江湖將在這一天精彩斑斕。css

但咱們要知道,寒冬之中,什麼是最珍貴,就讓鄙人告訴你:人才。只要有過硬的技術和裝備,在逆風直下的狀況下,我們也能迎難而上,打他個戳手不及。不是「李雲龍」大哥說:「過狹路相逢勇者勝.」git

最近幾天看了朋友,處處廝殺,通過一番鬥爭,最終奪下頭籌得到多家大廠的offer。程序員

承蒙兄弟擡愛,感情深厚。拿出《iOS中高級面試寶典》贈與小弟參悟。通過小弟個人反覆參悟和整理,如今共享出來,但願與你們一塊兒學習參悟。小弟我先說一下,面試雖然有技巧,但咋們毫不是吹噓與僞造之輩,因先當花點時間靜心閉關修煉,帶到出關之日,必進大廠,薪資翻倍,豈不快哉!!!web

參悟規則

做爲一名優秀的程序員,確定是不會浪費時間在一個 :面試

一:沒有晉升,沒有職業發展的公司編程

二:也不會停留在某一個技術層面不前進的公司swift

三:我願付出真心,你卻不肯有待個人公司緩存

本博客的知識點較多,花點時間一個個理解並記憶後,天然也就融會貫通,無所畏懼。面試iOS也就分分鐘
本寶典爲了便於記憶,快速達到應試狀態,相似於複習知識大綱。知識點會盡可能的精簡與提煉知識脈絡,並不去展開深刻細節,面面俱到。有興趣或者有疑問的兄弟能夠自行谷歌下對應知識點的詳細內容。安全

做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人 iOS交流羣:761407670 進羣密碼‘思否’,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!

一、swift和oc的區別

(1) Swit沒有地址指針的概念服務器

(2)泛型

(3)類型嚴謹對比oc的動態綁定

二、編譯鏈接

  • idinstancetype的區別
  • instancetype只能故返回值編譯時判斷真實類型,不符合發警告
  • 特殊狀況:關聯類型返回方法如類方法llocnew開頭實例方法中,以autorelease,init,retain,或self開頭

三、synthesize & denamic

1:經過@sythesize

指令告訴編譯器在編譯期間產生getter/setter方法。

2:經過@dynamic指令,本身實現方法。

有些存取是在運行時動態建立的,如在CoreDataNSManagedObject類使

四、在項目開發中經常使用的開發工具備哪些?

  • instrument
  • beyondCompare
  • git

五、UlTableView & UlCollection

  • UlCollectionView是iOS6新引進的API,用於展現集合視圖,佈局更加靈活,其用法相似於UITableView
  • 而UICollectionView、UlCollectionViewCell與UITableView、UITableViewCell在用法上有類似的也有不一樣的,
    下面是一些基本的使用方法:對UITableView,僅須要UITableViewDataSource,UITableViewDelegate這兩個協議
  • 使用UlCollectionView須要實現:UICollectionViewDataSource,UlCollectionViewDelegate,
    UlCollectionViewDelegateFlowLayout這三個協議.
  • 這是由於UlCollectionViewDelegateFlowL ayou其實是UCollectionViewDelegate的一個子協議,它繼承了
    UlCollectionViewDelegate,它的做用是提供一些定義UlCollectionView佈局模式的函數

六、NSProxy & NSObject

NSObjetct:
  • NSObject協議組對全部的Object -C下的objects都生效。若是objects聽從該協議,就會波看做是first -class
    objects (- 級類)。另外, 聽從該協議的objects的retain, release, autorelease等 方法也服從objects的管理和在
    Foundation中定義的釋放方法。- -些容器中的對象也能夠管理這些
  • objects,好比說NSArrayNSDictionary定義的對象。Cocoa的根類也遵循該協議,因此全部繼承NSObjects的
    objects都有遵循該協議的特性。
  • NSProXY:NSProxy是一個虛基類,它爲一些表現的像是其它對象替身或者並不存在的對象定義一套API。 -般
    的,發送給代理的消息被轉發給一個真實的對象或者代理自己load(或者將自己轉換成)一個真實的對象。
  • NSProxy的基類能夠被用來透明的轉發消息或者耗費巨大的對象的lazy初始化。

七、Object & Swift

  • Obejective-C複雜的語法,更加簡單易用、有將來,讓許多開發者心動不已.
  • 蘋果宣稱Swift的特色是:快速、現代、安全、互動,並且明顯優於Objective-C語言
    可使用現有的Cocoa和Cocoa Touch框架
    Swift取消了Objective C的指針及其餘不安全訪問的使用
  • 捨棄Objective C早期應用Smalltalk的語法,全面改成句點表示法提供了相似Java的名字空間(namespace)、
    泛型(generic)、運算對象重載(operator overloading) Swift 被簡單的形容爲「沒有C的Objective-C" (Objective- C without theC)爲蘋果開發工具帶來了Xcode
  • Playgrounds功能,該功能提供強大的互動效果,能讓Swift源代碼在撰寫過程當中實時顯示出其運行結果;
    基於C和Objective-C,而卻沒有C的一些兼容約束; 採用了安全的編程模式;界面基於Cocoa和Cocoa Touch框架;保留Smaltalk的動態特性

八、傳值通知&推送通知(本地&遠程)

傳值通知:相似通知,代理,Block實現值得傳遞

推送通知:推送到用戶手機對應的App上(主要是再也不前臺的狀況)本地通知。

local notfication,用於基於時間行爲的通知,好比有關日曆或者todo列表的小應用。另外,應用若是在後臺執
行,iOS容許它在受限的時間內運行,它也會發現本地通知有用。好比,一個應用,在後臺運行,嚮應用的服
務器端獲取消息,當消息到達時,好比下載更新版本的提示消息,經過本地通知機制通知用戶。

本地通知是UILocalNotification的實例,主要有三類屬性:

scheduled time,時間週期,用來指定iOS系統發送通知的8期和時間;
ntilication type,通知類型,包括警告信息、動做按鈕的標題、應用圖標上的badge (數字標記)和播放的聲音:

自定義數據,本地通知能夠包含一個dictionary類型的本地數據。

對本地通知的數量限制,iOS最 多容許最近本地通知數量是64個,超過限制的本地通知將被iOS忽略。遠程通知(須要服務器)
流程大概是這樣的

1.生成CerticateSigningRequest. certSigningRequest文件

2.將CertilicateSigningRequest.certSigningRequest上傳進developer,導出.cer文件

3.利用CSR導出P12文件

4.須要準備下設備token值(無空格)

5.使用OpenSSL合成服務器所使用的推送證書

通常使用極光推送,步驟是同樣的, 只是咱們使用的服務器是極光的,不須要本身大服務器!

九、第三方庫&第三方平臺

第三方庫:

通常是指大牛封裝好的一一個框架(庫) ,或者第三方給咱們提供的一個庫,這裏比較籠統*第三方平
臺:指第三方提供的-些服務,其實不少方面跟第三方庫是同樣的,可是仍是存在一些區別。

區別:庫: AFN, ASI, Alomofire, MJRefresh, MJExtension, MBProgressHUD平臺:極光,百度,友盟,Mob,環信

imageName和mageWithContextOfFile的區別?哪一個性能高

(1)用imageNamed的方式加載時,圖片使用完畢後緩存到內存中,內存消耗多,加載速度快。即便生成的
對象被autoReleasePool釋放了,這份緩存也不釋放,若是圖像比較大,或者圖像比較多,用這種方式會消耗
很大的內存。
imageNamed採用了緩存機制,若是緩存中已加載了圖片,直接從緩存讀就好了,每次就不用再去讀文件了,
效率會更高。

(2) ImageWithContextOfile加載, 圖片是不會緩存的,加載速度慢。

(3)大量使用imageNamed方式會在不須要緩存的地方額外增長開銷CPU的時間當應用程字須要加載- -張比較
大的圖片而且使用一次性,那麼實際上是沒有必要去緩存這個圖片的,用imageWithContentsOfile是 最爲經濟
的方式,這樣不會由於Ullmage元素較多狀況下,CPU會被逐個分散在沒必要要緩存上浪費過多時間

十、NSCache & NSDcitionary

NSCache與可變集合有幾點不一樣:

NSCache類結合了各類自動刪除策略,以確保不會佔用過多的系統內存。若是其它應用須要內存時,系統自
動執行這些策略。當調用這些策略時,會從緩存中刪除一些對象,以最大限度減小內存的佔用。

  • NSCache是線程安全的,咱們能夠在不一樣的線程中添加、刪除和查詢緩存中的對象,而不須要鎖定緩存區域。
  • 不像NSMutableDictionary對象,- 一個緩存對象不會拷貝key對象。
  • NSCacheNSDictionary相似,不一樣的是系統回收內存的時候它會自動刪掉它的內容。

(1)能夠存儲(固然是使用內存)

(2)保持強應用,無視垃圾回收. =>這-點同NSMutableDictionary(3)有固定客戶.

十一、UlView的setNeedsDisplay和setNeedsLayout方法

  • Mac OSNSWindow的父類是NSResponder,而在iOSUIWindow的父類是UIVIew。程序通常只有一一個窗口可是會又不少視圖
  • UlView的做用: 描畫和動畫,視圖負責對其所屬的矩形區域描畫、佈局和子視圖管理、事件處理、能夠接收觸摸事件、事件信息的載體、等等。
  • UIViewController負責建立其管理的視圖及在低內存的時候將他們從內存中移除。還爲標準的系統行爲進行響應。
  • layOutSubViews能夠在本身定製的視圖中重載這個方法,用來調整子視圖的尺寸和位置。
  • UIViewsetNeedsDisplay(需 要從新顯示,繪製和setNeedsLayout(須要從新佈局)方法。首先兩個方法都是異步執行的。而setNeedsDisplay會調用自動調用drawRect方法,這樣能夠拿到UIGraphicsGetCurrentContext,就能夠畫畫了。而setNeedslayout會默認調用layoutSubViews,就能夠處理子視圖中的一些數據。

綜上所述setNeedsDisplay方便繪圖,而layoutSubViews方便出來數據setNeedDisplay告知視圖它發生了改變,須要從新繪製自身,就至關於刷新界面

十二、UILayer & UiView

  • UlView是iOS系統中界面元素的基礎,全部的界面元素都繼承自它。它自己徹底是由CoreAnimation來實現的(Mac下彷佛不是這樣)。它真正的繪圖部分,是由一個叫CAL ayer (Core Animation Layer)的類來管理。UIView自己,更像是-個CAL ayer的管理器,訪問它的跟繪圖和跟座標有關的屬性,例如frame, bounds等等,實際 上內部都是在訪問它所包含的CAL ayer的相關屬性。
  • UIView有個重要屬性layer,能夠返回它的主CAL ayer實例。
  • UIViewCAL ayer相似UIView的子View樹形結構,也能夠向它的layer上添加子layer,來完成某些特殊的表示。即CALayer層是能夠嵌套的。
  • UIViewayer樹形在系統內部,被維護着三份opy。分別是邏輯樹,這裏是代碼能夠操縱的;動畫樹,是一箇中間層,系統就在這一層上更改屬性,進行各類渲染操做;顯示樹,其內容就是當前正被顯示在屏幕上得內容。

動畫的運做:UMiew的sublayer(非主Layer)屬性進行更改,系統將自動進行動畫生成,動畫持續時間的缺省值彷佛是0.5秒。

座標系統: CAL ayer的座標系統比UIView多了-個anchorPoint屬性,使用CGPoint結構表示,值域是0~1,是個比例值。

渲染: 當更新層,改變不能當即顯示在屏幕上。當全部的層都準備好時,能夠調用setNeedsDisplay方法來重繪顯示。

變換: 要在一個層中添加- -個3D或仿射變換,能夠分別設置層的transformfineTranstorm屬性。

變形: Quartz Core的渲染能力,使二維圖像能夠被自由操縱,就好像是三維的。圖像能夠在一個三維座標系中以任意角度被旋轉,縮放和傾斜。CATranstform3D的一套方法提供了一些魔術般的變換效果。

1三、layoutSubViews & drawRects

layoutSubviews在如下狀況下會波調用(視圖位置變化是觸發):

一、init初始化不會觸發layoutSubviews。

二、addSubview會觸發layoutSubviews。

三、設置Vview的Frame會觸發layoutSubviews,固然前提是frame的值設置先後發生了變化。

四、滾動一個UISCrollView會觸發layoutSubviews。

五、旋轉Screen會觸發父UIView上的layoutSubviews事件。

六、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件。

七、直接調用setLayoutSubviews。

drawRect在如下狀況下會被調用:

一、若是在UIView初始化時沒有設置rect大小,將直接致使drawRect不被自動調用。drawRect 掉用是在Controller->loadView,Controller->viewDidLoad兩方法以後掉用的.因此不用擔憂在控制器中,這些View的drawRect就開始畫了.這樣能夠在控制器中設置-些值給View(若是這些View draw的時候須要用到某些變量值).

二、該方法在調用sizeToFit後被調用,因此能夠先調用sizeToFt計算出size。而後系統自動調用drawRect:方法。

三、經過設置contentMode屬性直爲UIViewContentModeRedraw。那麼將在每次設置或更改rame的時候自動調用dr awRect

四、直接調用setNeedsDisplay, 或者setNeedsDisplaylnRect:觸發drawRect,可是有個前提條件是rect不能爲0

drawRect方法使用注意點:

一、若使用UIView繪圖,只能在drawRect:方法中獲取相應的contextRef並繪圖。若是在其餘方法中獲取將獲取到一個invalidateref而且不能用於畫圖。

drawRect: 方法不能手動顯示調用,必須經過調用setNeedsDisplay或者setNeedsDisplaynRect,讓系統自動調該方法。

二、若使用calayer繪圖,只能在drawInContext: 中(類 似魚drawRect)繪製,或者在delegate中的相應方法繪製。一樣也是調用setNeedDisplay等間接調用以上方法

三、若要實時畫圖,不能使HgestureRecognizer,只能使用touchbegan等方法來掉用setNeedsDisplay實時刷新屏幕

1四、UDID & UUID

UDID是Unique Device ldentifer的縮寫中文意思是設備惟一標識

在不少須要限制一臺設備一個帳號的應用中常常會用到,在Symbian時代,咱們是使用IMEI做爲設備的惟一標識的,惋惜的是Apple官方不容許開發者得到設備的IMEI.

lUlDevice currentDevicel uniqueldentie]

可是咱們須要注意的一點是,對於已越獄了的設備,UDID並非惟一的 使用Cydia插件UDIDFaker,能夠爲每個應用分配不一樣的UDID.因此UDID做爲標識惟一設備的用途已經不大了。

UUID是Universally Unique ldentifier的縮寫,中文意思是通用惟一識別碼由網上資料顯示,UUID是一個軟件建構的標準,也是被開源軟件基金會(Open Software Foundation,OSF)的組織在分佈式計算環境(DistributedComputing Enviroment,DCE)領域的一部份.UUID的目的,是 讓分佈式系統中的全部元素都能有惟一的辨識資訊,而不須要透過中央控制端來作辨識資訊的指定。

1五、CPU & GPU

CPU:中央處理器(英 文Central ProcessingUnit)是一臺計算機的運算核心和控制核心。CPU、內部存儲器和輸入輸出設備是電子計算機三大核心部件。其功能主要是解釋計算機指令以及處理計算機軟件中的數據。

GPU:英文全稱Graphic Processing Unit,中文翻譯爲「圖形處理器」。一個專門的圖形核心處理器。GPU是顯示卡的「大腦」,決定了該顯卡的檔次和大部分性能,同時也是2D顯示卡和3D顯示卡的區別依據。2D顯示芯片在處理3D圖像和特效時主要依賴CPU的處理能力,稱爲「軟加速」。3D顯示芯片是將三維圖像和特效處理功能集中在顯示芯片內,也即所謂的"硬件加速"功能

結語

因爲寶典內容過多,我就不一一介紹,就先寫到這裏的吧!你們不用着急慢慢來。給你們看看目錄吧!

每一個大廠的面試並非很容易對付,不少的技術領域並無真正的答案,看本身能給出讓人滿意的回答,最終還靠本身去實踐、研究。知識方面的深度與廣度都該在同一條路上,昇華本身。如不嫌棄小編個你們推薦一個個人 iOS交流羣:761407670 進羣密碼‘思否’,進羣能夠在羣文件裏面獲取這篇面試題的所有答案,學習資料,iOS相關方面的電子書。羣裏純技術交流!
相關文章
相關標籤/搜索