中高級iOS大廠面試寶典!

引言

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

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

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

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

參悟規(guī)則

作為一名優(yōu)秀的程序員,肯定是不會浪費時間在一個 :

一:沒有晉升,沒有職業(yè)發(fā)展的公司

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

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

本博客的知識點較多,花點時間一個個理解并記憶后,自然也就融會貫通,無所畏懼。面試iOS也就分分鐘
本寶典為了便于記憶,快速達到應(yīng)試狀態(tài),類似于復習知識大綱。知識點會盡量的精簡與提煉知識脈絡(luò),并不去展開深入細節(jié),面面俱到。有興趣或者有疑問的兄弟可以自行谷歌下對應(yīng)知識點的詳細內(nèi)容。

1、swift和oc的區(qū)別

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

(2)泛型

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

2、編譯連接

  • idinstancetype的區(qū)別

  • instancetype只能故返回值編譯時判斷真實類型,不符合發(fā)警告

  • 特殊情況:關(guān)聯(lián)類型返回方法如類方法llocnew開頭實例方法中,以autorelease,init,retain,或self開頭

3、synthesize & denamic

1:通過@sythesize

指令告訴編譯器在編譯期間產(chǎn)生getter/setter方法。

2:通過@dynamic指令,自己實現(xiàn)方法。

有些存取是在運行時動態(tài)創(chuàng)建的,如在CoreDataNSManagedObject類使

4、在項目開發(fā)中常用的開發(fā)工具有哪些?

  • instrument

  • beyondCompare

  • git

5、UlTableView & UlCollection

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

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

  • 使用UlCollectionView需要實現(xiàn):UICollectionViewDataSource,UlCollectionViewDelegate,
    UlCollectionViewDelegateFlowLayout這三個協(xié)議.

  • 這是因為UlCollectionViewDelegateFlowL ayou實際上是UCollectionViewDelegate的一個子協(xié)議,它繼承了
    UlCollectionViewDelegate,它的作用是提供一些定義UlCollectionView布局模式的函數(shù)

6、NSProxy & NSObject

NSObjetct:
  • NSObject協(xié)議組對所有的Object -C下的objects都生效。如果objects遵從該協(xié)議,就會波看作是first -class
    objects (- 級類)。另外, 遵從該協(xié)議的objects的retain, release, autorelease等 方法也服從objects的管理和在
    Foundation中定義的釋放方法。- -些容器中的對象也可以管理這些
  • objects,比如說NSArrayNSDictionary定義的對象。Cocoa的根類也遵循該協(xié)議,所以所有繼承NSObjects的
    objects都有遵循該協(xié)議的特性。
  • NSProXY:NSProxy是一個虛基類,它為一些表現(xiàn)的像是其它對象替身或者并不存在的對象定義一套API。 -般
    的,發(fā)送給代理的消息被轉(zhuǎn)發(fā)給一個真實的對象或者代理本身load(或者將本身轉(zhuǎn)換成)一個真實的對象。

  • NSProxy的基類可以被用來透明的轉(zhuǎn)發(fā)消息或者耗費巨大的對象的lazy初始化。

7、Object & Swift

  • Obejective-C復雜的語法,更加簡單易用、有未來,讓許多開發(fā)者心動不已.

  • 蘋果宣稱Swift的特點是:快速、現(xiàn)代、安全、互動,而且明顯優(yōu)于Objective-C語言
    可以使用現(xiàn)有的Cocoa和Cocoa Touch框架
    Swift取消了Objective C的指針及其他不安全訪問的使用

  • 舍棄Objective C早期應(yīng)用Smalltalk的語法,全面改為句點表示法提供了類似Java的名字空間(namespace)、
    泛型(generic)、運算對象重載(operator overloading) Swift 被簡單的形容為“沒有C的Objective-C" (Objective- C without theC)為蘋果開發(fā)工具帶來了Xcode
  • Playgrounds功能,該功能提供強大的互動效果,能讓Swift源代碼在撰寫過程中實時顯示出其運行結(jié)果;
    基于C和Objective-C,而卻沒有C的一些兼容約束; 采用了安全的編程模式;界面基于Cocoa和Cocoa Touch框架;保留Smaltalk的動態(tài)特性

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

傳值通知:類似通知,代理,Block實現(xiàn)值得傳遞

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

local notfication,用于基于時間行為的通知,比如有關(guān)日歷或者todo列表的小應(yīng)用。另外,應(yīng)用如果在后臺執(zhí)
行,iOS允許它在受限的時間內(nèi)運行,它也會發(fā)現(xiàn)本地通知有用。比如,一個應(yīng)用,在后臺運行,向應(yīng)用的服
務(wù)器端獲取消息,當消息到達時,比如下載更新版本的提示消息,通過本地通知機制通知用戶。

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

scheduled time,時間周期,用來指定iOS系統(tǒng)發(fā)送通知的8期和時間;
ntilication type,通知類型,包括警告信息、動作按鈕的標題、應(yīng)用圖標上的badge (數(shù)字標記)和播放的聲音:

自定義數(shù)據(jù),本地通知可以包含一個dictionary類型的本地數(shù)據(jù)。

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

1.生成CerticateSigningRequest. certSigningRequest文件

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

3.利用CSR導出P12文件

4.需要準備下設(shè)備token值(無空格)

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

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

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

第三方庫:

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

區(qū)別:庫: AFN, ASI, Alomofire, MJRefresh, MJExtension, MBProgressHUD平臺:極光,百度,友盟,Mob,環(huán)信

imageName和mageWithContextOfFile的區(qū)別?哪個性能高

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

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

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

10、NSCache & NSDcitionary

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

NSCache類結(jié)合了各種自動刪除策略,以確保不會占用過多的系統(tǒng)內(nèi)存。如果其它應(yīng)用需要內(nèi)存時,系統(tǒng)自
動執(zhí)行這些策略。當調(diào)用這些策略時,會從緩存中刪除一些對象,以最大限度減少內(nèi)存的占用。

  • NSCache是線程安全的,我們可以在不同的線程中添加、刪除和查詢緩存中的對象,而不需要鎖定緩存區(qū)域。

  • 不像NSMutableDictionary對象,- 一個緩存對象不會拷貝key對象。

  • NSCacheNSDictionary類似,不同的是系統(tǒng)回收內(nèi)存的時候它會自動刪掉它的內(nèi)容。

(1)可以存儲(當然是使用內(nèi)存)

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

11、UlView的setNeedsDisplay和setNeedsLayout方法

  • Mac OSNSWindow的父類是NSResponder,而在iOSUIWindow的父類是UIVIew。程序一般只有一一個窗口但是會又很多視圖

  • UlView的作用: 描畫和動畫,視圖負責對其所屬的矩形區(qū)域描畫、布局和子視圖管理、事件處理、可以接收觸摸事件、事件信息的載體、等等。

  • UIViewController負責創(chuàng)建其管理的視圖及在低內(nèi)存的時候?qū)⑺麄儚膬?nèi)存中移除。還為標準的系統(tǒng)行為進行響應(yīng)。

  • layOutSubViews可以在自己定制的視圖中重載這個方法,用來調(diào)整子視圖的尺寸和位置。

  • UIViewsetNeedsDisplay(需 要重新顯示,繪制和setNeedsLayout(需要重新布局)方法。首先兩個方法都是異步執(zhí)行的。而setNeedsDisplay會調(diào)用自動調(diào)用drawRect方法,這樣可以拿到UIGraphicsGetCurrentContext,就可以畫畫了。而setNeedslayout會默認調(diào)用layoutSubViews,就可以處理子視圖中的一些數(shù)據(jù)。

綜上所述setNeedsDisplay方便繪圖,而layoutSubViews方便出來數(shù)據(jù)setNeedDisplay告知視圖它發(fā)生了改變,需要重新繪制自身,就相當于刷新界面

12、UILayer & UiView

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

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

  • UIViewCAL ayer類似UIView的子View樹形結(jié)構(gòu),也可以向它的layer上添加子layer,來完成某些特殊的表示。即CALayer層是可以嵌套的。

  • UIViewayer樹形在系統(tǒng)內(nèi)部,被維護著三份opy。分別是邏輯樹,這里是代碼可以操縱的;動畫樹,是一個中間層,系統(tǒng)就在這一層上更改屬性,進行各種渲染操作;顯示樹,其內(nèi)容就是當前正被顯示在屏幕上得內(nèi)容。

動畫的運作:UMiew的sublayer(非主Layer)屬性進行更改,系統(tǒng)將自動進行動畫生成,動畫持續(xù)時間的缺省值似乎是0.5秒。

坐標系統(tǒng): CAL ayer的坐標系統(tǒng)比UIView多了-個anchorPoint屬性,使用CGPoint結(jié)構(gòu)表示,值域是0~1,是個比例值。

渲染: 當更新層,改變不能立即顯示在屏幕上。當所有的層都準備好時,可以調(diào)用setNeedsDisplay方法來重繪顯示。

變換: 要在一個層中添加- -個3D或仿射變換,可以分別設(shè)置層的transformfineTranstorm屬性。

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

13、layoutSubViews & drawRects

layoutSubviews在以下情況下會波調(diào)用(視圖位置變化是觸發(fā)):

1、init初始化不會觸發(fā)layoutSubviews。

2、addSubview會觸發(fā)layoutSubviews。

3、設(shè)置Vview的Frame會觸發(fā)layoutSubviews,當然前提是frame的值設(shè)置前后發(fā)生了變化。

4、滾動一個UISCrollView會觸發(fā)layoutSubviews。

5、旋轉(zhuǎn)Screen會觸發(fā)父UIView上的layoutSubviews事件。

6、改變一個UIView大小的時候也會觸發(fā)父UIView上的layoutSubviews事件。

7、直接調(diào)用setLayoutSubviews。

drawRect在以下情況下會被調(diào)用:

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

2、該方法在調(diào)用sizeToFit后被調(diào)用,所以可以先調(diào)用sizeToFt計算出size。然后系統(tǒng)自動調(diào)用drawRect:方法。

3、通過設(shè)置contentMode屬性直為UIViewContentModeRedraw。那么將在每次設(shè)置或更改rame的時候自動調(diào)用dr awRect。

4、直接調(diào)用setNeedsDisplay, 或者setNeedsDisplaylnRect:觸發(fā)drawRect,但是有個前提條件是rect不能為0

drawRect方法使用注意點:

1、若使用UIView繪圖,只能在drawRect:方法中獲取相應(yīng)的contextRef并繪圖。如果在其他方法中獲取將獲取到一個invalidateref并且不能用于畫圖。

drawRect: 方法不能手動顯示調(diào)用,必須通過調(diào)用setNeedsDisplay或者setNeedsDisplaynRect,讓系統(tǒng)自動調(diào)該方法。

2、若使用calayer繪圖,只能在drawInContext: 中(類 似魚drawRect)繪制,或者在delegate中的相應(yīng)方法繪制。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法

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

14、UDID & UUID

UDID是Unique Device ldentifer的縮寫中文意思是設(shè)備唯一標識

在很多需要限制一臺設(shè)備一個賬號的應(yīng)用中經(jīng)常會用到,在Symbian時代,我們是使用IMEI作為設(shè)備的唯一標識的,可惜的是Apple官方不允許開發(fā)者獲得設(shè)備的IMEI.

lUlDevice currentDevicel uniqueldentie]

但是我們需要注意的一點是,對于已越獄了的設(shè)備,UDID并不是唯一的 使用Cydia插件UDIDFaker,可以為每一個應(yīng)用分配不同的UDID.所以UDID作為標識唯一設(shè)備的用途已經(jīng)不大了。

UUID是Universally Unique ldentifier的縮寫,中文意思是通用唯一識別碼由網(wǎng)上資料顯示,UUID是一個軟件建構(gòu)的標準,也是被開源軟件基金會(Open Software Foundation,OSF)的組織在分布式計算環(huán)境(DistributedComputing Enviroment,DCE)領(lǐng)域的一部份.UUID的目的,是 讓分布式系統(tǒng)中的所有元素都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。

15、CPU & GPU

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

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

結(jié)語

由于寶典內(nèi)容過多,我就不一一介紹,就先寫到這里的吧!大家不用著急慢慢來。給大家看看目錄吧!

image
image

每個大廠的面試并不是很容易對付,很多的技術(shù)領(lǐng)域并沒有真正的答案,看自己能給出讓人滿意的回答,最終還靠自己去實踐、研究。知識方面的深度與廣度都該在同一條路上,升華自己。如不嫌棄小編個大家推薦一個內(nèi)推技術(shù)群:679884541,進群可以在群文件里面獲取這篇面試題的全部答案,學習資料,iOS相關(guān)方面的電子書。群里純技術(shù)交流!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容