引言
過年之後相信有一部分的人,早已磨刀霍霍向大廠。勢必要大展拳腳,必將在大廠內創出一片天地。但是,想必大家都知道:最近幾年的最嚴重的互聯網寒冬來臨,各位兄弟都會說“江湖再見”。耳邊總是充刺着流言蜚語,這個地方裁員了,這個地方縮減HC。弄得人心慌慌。年後將是一片血雨腥風,程序界的江湖將在這一天精彩斑斕。
但我們要知道,寒冬之中,什麼是最珍貴,就讓鄙人告訴你:人才。只要有過硬的技術和裝備,在逆風直下的情況下,咱們也能迎難而上,打他個戳手不及。不是“李雲龍”大哥說:“過狹路相逢勇者勝.”
最近幾天看了朋友,到處廝殺,經過一番鬥爭,最終奪下頭籌獲得多家大廠的offo。
承蒙兄弟擡愛,感情深厚。拿出《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 & NSObject
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.生成CerticateSigningRequest. certSigningRequest文件
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顯示芯片是將三維圖像和特效處理功能集中在顯示芯片內,也即所謂的"硬件加速"功能
結語
由於寶典內容過多,我就不一一介紹,就先寫到這裏的吧!大家不用着急慢慢來。給大家看看目錄吧!
每個大廠的面試並不是很容易對付,很多的技術領域並沒有真正的答案,看自己能給出讓人滿意的回答,最終還靠自己去實踐、研究。知識方面的深度與廣度都該在同一條路上,昇華自己。如不嫌棄我自己有個私人羣:551346706,進羣可以在羣文件裏面獲取這篇面試題的全部答案,學習資料,iOS相關方面的電子書。羣裏純技術交流!