歡迎光臨
每天分享高質量文章

中高階iOS大廠面試寶典,拿到offer率80%,金三銀四將是你的新起點

作者:_小迷糊

連結:https://www.jianshu.com/p/0ae79e7d7b93

引言

過年之後相信有一部分的人,早已磨刀霍霍向大廠。勢必要大展拳腳,必將在大廠內創出一片天地。但是,想必大家都知道:最近幾年的最嚴重的網際網路寒冬來臨,各位兄弟都會說“江湖再見”。耳邊總是充刺著流言蜚語,這個地方裁員了,這個地方縮減HC。弄得人心慌慌。年後將是一片血雨腥風,程式界的江湖將在這一天精彩斑斕。

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

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

承蒙兄弟抬愛,感情深厚。拿出《iOS中高階面試寶典》贈與小弟參悟。經過小弟我的反覆參悟和整理,現在共享出來,希望與大家一起學習參悟。小弟我先說一下,面試雖然有技巧,但咋們絕不是吹噓與偽造之輩,因先當花點時間靜心閉關修煉,帶到出關之日,必進大廠,薪資翻倍,豈不快哉!!!

參悟規則

作為一名優秀的程式員,肯定是不會浪費時間在一個 :

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

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

三:我願付出真心,你卻不願有待我的公司

本部落格的知識點較多,花點時間一個個理解並記憶後,自然也就融會貫通,無所畏懼。面試iOS也就分分鐘。


本寶典為了便於記憶,快速達到應試狀態,類似於複習知識大綱。知識點會儘量的精簡與提煉知識脈絡,並不去展開深入細節,面面俱到。有興趣或者有疑問的兄弟可以自行谷歌下對應知識點的詳細內容。

1、swift和oc的區別

(1) Swit沒有地址指標的概念

(2)泛型

(3)型別嚴謹對比oc的動態系結

2、編譯連線

  • id和instancetype的區別

  • instancetype只能故傳回值編譯時判斷真實型別,不符合發警告

  • 特殊情況:關聯型別傳回方法如類方法lloc或new開頭實體方法中,以autorelease,init,retain,或self開頭

3、synthesize & denamic

1:透過@sythesize

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

2:透過@dynamic指令,自己實現方法。

有些存取是在執行時動態建立的,如在CoreData的NSManagedObject類使

4、在專案開發中常用的開發工具有哪些?

  • instrument

  • beyondCompare

  • git

5、UlTableView & UlCollection

  • UlCollectionView是iOS6新引進的API,用於展示集合檢視,佈局更加靈活,其用法類似於UITableView。

  • 而UICollectionView、UlCollectionViewCell與UITableView、UITableViewCell在用法上有相似的也有不同的,
    下麵是一些基本的使用方法:對UITableView,僅需要UITableViewDataSource,UITableViewDelegate這兩個協議

  • 使用UlCollectionView需要實現:UICollectionViewDataSource,UlCollectionViewDelegate,
    UlCollectionViewDelegateFlowLayout這三個協議.

  • 這是因為UlCollectionViewDelegateFlowL ayou實際上是UCollectionViewDelegate的一個子協議,它繼承了
    UlCollectionViewDelegate,它的作用是提供一些定義UlCollectionView佈局樣式的函式

6、NSProxy & NSObjec

NSObjetct:

 

  • NSObject協議組對所有的Object -C下的objects都生效。如果objects遵從該協議,就會波看作是first -class
    objects (- 級類)。另外, 遵從該協議的objects的retain, release, autorelease等 方法也服從objects的管理和在
    Foundation中定義的釋放方法。- -些容器中的物件也可以管理這些

  • objects,比如說NSArray和NSDictionary定義的物件。Cocoa的根類也遵循該協議,所以所有繼承NSObjects的
    objects都有遵循該協議的特性。

  • NSProXY:NSProxy是一個虛基類,它為一些表現的像是其它物件替身或者並不存在的物件定義一套API。 -般
    的,傳送給代理的訊息被轉發給一個真實的物件或者代理本身load(或者將本身轉換成)一個真實的物件。

  • NSProxy的基類可以被用來透明的轉發訊息或者耗費巨大的物件的lazy初始化。

7、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的動態特性

8、傳值通知&推送通知(本地&遠端)

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

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

local notfication,用於基於時間行為的通知,比如有關日曆或者todo串列的小應用。另外,應用如果在後臺執行,iOS允許它在受限的時間內執行,它也會發現本地通知有用。比如,一個應用,在後臺執行,嚮應用的伺服器端獲取訊息,當訊息到達時,比如下載更新版本的提示訊息,透過本地通知機制通知使用者。

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

scheduled time,時間週期,用來指定iOS系統傳送通知的8期和時間;


ntilication type,通知型別,包括警告資訊、動作按鈕的標題、應用圖示上的badge (數字標記)和播放的聲音:

自定義資料,本地通知可以包含一個dictionary型別的本地資料。

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

 

1.生成CerticateSigningRequestcertSigningRequest檔案
2.將CertilicateSigningRequest.certSigningRequest上傳進developer,匯出.cer檔案
3.利用CSR匯出P12檔案
4.需要準備下裝置token值(無空格)
5.使用OpenSSL合成伺服器所使用的推送證書

一般使用極光推送,步驟是一樣的, 只是我們使用的伺服器是極光的,不需要自己大伺服器!

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

第三方庫:

一般是指大牛封裝好的一一個框架(庫) ,或者第三方給我們提供的一個庫,這裡比較籠統*第三方平
臺:指第三方提供的-些服務,其實很多方面跟第三方庫是一樣的,但是還是存在一些區別。

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

imageName和mageWithContextOfFile的區別?哪個效能高

(1)用imageNamed的方式載入時,圖片使用完畢後快取到記憶體中,記憶體消耗多,載入速度快。即使生成的物件被autoReleasePool釋放了,這份快取也不釋放,如果影象比較大,或者影象比較多,用這種方式會消耗很大的記憶體。


imageNamed採用了快取機制,如果快取中已載入了圖片,直接從快取讀就行了,每次就不用再去讀檔案了,效率會更高。

(2) ImageWithContextOfile載入, 圖片是不會快取的,載入速度慢。

(3)大量使用imageNamed方式會在不需要快取的地方額外增加開銷CPU的時間當應用程字需要載入- -張比較大的圖片並且使用一次性,那麼其實是沒有必要去快取這個圖片的,用imageWithContentsOfile是 最為經濟的方式,這樣不會因為Ullmage元素較多情況下,CPU會被逐個分散在不必要快取上浪費過多時間

10、NSCache & NSDcitionary

NSCache與可變集合有幾點不同:

NSCache類結合了各種自動刪除策略,以確保不會佔用過多的系統記憶體。如果其它應用需要記憶體時,系統自動執行這些策略。當呼叫這些策略時,會從快取中刪除一些物件,以最大限度減少記憶體的佔用。

  • NSCache是執行緒安全的,我們可以在不同的執行緒中新增、刪除和查詢快取中的物件,而不需要鎖定快取區域。

  • 不像NSMutableDictionary物件,- 一個快取物件不會複製key物件。

  • NSCache和NSDictionary類似,不同的是系統回收記憶體的時候它會自動刪掉它的內容。

(1)可以儲存(當然是使用記憶體

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

11、UlView的setNeedsDisplay和setNeedsLayout方法

  • 在Mac OS中NSWindow的父類是NSResponder,而在iOS中UIWindow的父類是UIVIew。程式一般只有一一個視窗但是會又很多檢視

  • UlView的作用: 描畫和動畫,檢視負責對其所屬的矩形區域描畫、佈局和子檢視管理、事件處理、可以接收觸控事件、事件資訊的載體、等等。

  • UIViewController負責建立其管理的檢視及在低記憶體的時候將他們從記憶體中移除。還為標準的系統行為進行響應。

  • layOutSubViews可以在自己定製的檢視中多載這個方法,用來調整子檢視的尺寸和位置。

  • UIView的setNeedsDisplay(需 要重新顯示,繪製和setNeedsLayout(需要重新佈局)方法。首先兩個方法都是非同步執行的。而setNeedsDisplay會呼叫自動呼叫drawRect方法,這樣可以拿到UIGraphicsGetCurrentContext,就可以畫畫了。而setNeedslayout會預設呼叫layoutSubViews,就可以處理子檢視中的一些資料。

綜上所述setNeedsDisplay方便繪圖,而layoutSubViews方便出來資料setNeedDisplay告知檢視它發生了改變,需要重新繪製自身,就相當於掃清介面

12、UILayer & UiView

  • UlView是iOS系統中介面元素的基礎,所有的介面元素都繼承自它。它本身完全是由CoreAnimation來實現的(Mac下似乎不是這樣)。它真正的繪圖部分,是由一個叫CAL ayer (Core Animation Layer)的類來管理。UIView本身,更像是-個CAL ayer的管理器,訪問它的跟繪圖和跟坐標有關的屬性,例如frame, bounds等等,實際 上內部都是在訪問它所包含的CAL ayer的相關屬性。

  • UIView有個重要屬性layer,可以傳回它的主CAL ayer實體。

  • UIView的CAL ayer類似UIView的子View樹形結構,也可以向它的layer上新增子layer,來完成某些特殊的表示。即CALayer層是可以巢狀的。

  • UIView的ayer樹形在系統內部,被維護著三份opy。分別是邏輯樹,這裡是程式碼可以操縱的;動畫樹,是一個中間層,系統就在這一層上更改屬性,進行各種渲染操作;顯示樹,其內容就是當前正被顯示在螢幕上得內容。

動畫的運作: 對UMiew的sublayer(非主Layer)屬性進行更改,系統將自動進行動畫生成,動畫持續時間的預設值似乎是0.5秒。

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

渲染: 當更新層,改變不能立即顯示在螢幕上。當所有的層都準備好時,可以呼叫setNeedsDisplay方法來重繪顯示。

變換: 要在一個層中新增- -個3D或仿射變換,可以分別設定層的transform或fineTranstorm屬性。

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

13、layoutSubViews & drawRects

layoutSubviews在以下情況下會波呼叫(檢視位置變化是觸發):

1、init初始化不會觸發layoutSubviews。
2、addSubview會觸發layoutSubviews。
3、設定Vview的Frame會觸發layoutSubviews,當然前提是frame的值設定前後發生了變化。
4、滾動一個UISCrollView會觸發layoutSubviews。
5、旋轉Screen會觸發父UIView上的layoutSubviews事件。
6、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件。
7、直接呼叫setLayoutSubviews。
 

drawRect在以下情況下會被呼叫:

1、如果在UIView初始化時沒有設定rect大小,將直接導致drawRect不被自動呼叫。drawRect 掉用是在Controller->loadView,Controller->viewDidLoad兩方法之後掉用的.所以不用擔心在控制器中,這些View的drawRect就開始畫了.這樣可以在控制器中設定-些值給View(如果這些View draw的時候需要用到某些變數值).

2、該方法在呼叫sizeToFit後被呼叫,所以可以先呼叫sizeToFt計算出size。然後系統自動呼叫drawRect:方法。

3、透過設定contentMode屬性直為UIViewContentModeRedraw。那麼將在每次設定或更改rame的時候自動呼叫dr awRect。

4、直接呼叫setNeedsDisplay, 或者setNeedsDisplaylnRect:觸發drawRect,但是有個前提條件是rect不能為0。

drawRect方法使用註意點:

1、若使用UIView繪圖,只能在drawRect:方法中獲取相應的contextRef並繪圖。如果在其他方法中獲取將獲取到一個invalidate的ref並且不能用於畫圖。

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

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

3、若要實時畫圖,不能使HgestureRecognizer,只能使用touchbegan等方法來掉用setNeedsDisplay實時掃清螢幕

14、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的目的,是 讓分散式系統中的所有元素都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。

15、CPU & GPU

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

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

結語

由於寶典內容過多,我就不一一介紹,就先寫到這裡的吧!

贊(0)

分享創造快樂