在iOS行業(yè)如此飽和的今天,跳槽是需要勇氣的(ps裸辭)空镜,如此就要做好充足的準(zhǔn)備浩淘。
怎么大風(fēng)越狠,我心越蕩
保持信心吴攒,一路向前张抄。
生于憂患死于安樂(lè),這句話還是很有道理的洼怔。
廢話不多說(shuō)了署惯,還是直接來(lái)點(diǎn)實(shí)際的,如下是我準(zhǔn)備的一些問(wèn)題及相應(yīng)的個(gè)人理解(集各路英雄豪杰的總結(jié))镣隶,也是覺(jué)得面試官會(huì)問(wèn)的技術(shù)點(diǎn):
一. load
和initialize
的異同
load
類(lèi)方法是類(lèi)加載進(jìn)內(nèi)存的時(shí)候調(diào)用一次极谊,分類(lèi)中若實(shí)現(xiàn)了load
方法,也會(huì)被調(diào)用矾缓,且當(dāng)前類(lèi)的load方法會(huì)先調(diào)用怀酷,分類(lèi)中的load
方法后調(diào)用,不支持子類(lèi)重寫(xiě)嗜闻。
initialize
是類(lèi)在第一次使用時(shí)會(huì)調(diào)用一次蜕依,調(diào)用其子類(lèi)時(shí),父類(lèi)的initialize
會(huì)被先調(diào)用琉雳,支持重寫(xiě)样眠。
在這兩個(gè)方法中都不建議做一些負(fù)載的操作,以防止程序運(yùn)行或加載時(shí)出現(xiàn)阻塞的現(xiàn)象翠肘。
二.GCD
和NSOperationQueue
在實(shí)際項(xiàng)目中如何進(jìn)行選擇
首先NSOperationQueue
有如下的一些特新
- 取消某個(gè)操作檐束,調(diào)用
cancel
方法,會(huì)設(shè)置對(duì)象內(nèi)的標(biāo)志位束倍,用以表明下次任務(wù)不需執(zhí)行被丧。 - 可以指定操作間的依賴(lài)關(guān)系。
- 通過(guò)
KVO
監(jiān)控NSOperation
對(duì)象的屬性绪妹,可以判斷任務(wù)是否取消及任務(wù)是否已完成甥桂。 - 指定操作的優(yōu)先級(jí)。
- 重用
NSOperation
對(duì)象邮旷,實(shí)現(xiàn)自定義操作任務(wù)黄选。
然而GCD
也有它的優(yōu)勢(shì),主要內(nèi)部是基于C語(yǔ)音的一套封裝婶肩,調(diào)用的方法更底層办陷,運(yùn)行的速度也會(huì)更快貌夕。如果需要用到異步線程加載一些任務(wù),且不需要用到NSOperation
的那些特性民镜,首選還是用GCD
的啡专。
GCD
也有自己的特性:
- 通過(guò)
Dispatch Group
機(jī)制,根據(jù)系統(tǒng)資源來(lái)執(zhí)行任務(wù)制圈。 - 運(yùn)用
Dispatch Barrier
特性植旧,保證寫(xiě)入數(shù)據(jù)的線程安全。 - 運(yùn)用
Dispatch Once
來(lái)創(chuàng)建多線程下安全的單例离唐。
兩個(gè)的相同點(diǎn)都是操作隊(duì)列,實(shí)現(xiàn)多線程任務(wù)管理问窃。
三. UITableView
的優(yōu)化(防止卡頓)
1.主線程是用來(lái)更新UI的亥鬓,若來(lái)處理與UI更新無(wú)關(guān)的事情,就會(huì)出現(xiàn)卡頓域庇。(值得注意)
2.將計(jì)算cell
高度的過(guò)程在獲取數(shù)據(jù)時(shí)就直接計(jì)算保存好嵌戈,代理方法需要的時(shí)候,直接從模型中獲取听皿。
3.圖片的部分最好做緩存熟呛,避免讀I/O操作。
4.網(wǎng)絡(luò)加載下來(lái)的圖片尺寸最好跟顯示的frame
尺寸匹配尉姨,避免控件去壓縮圖片庵朝。
5.cell
的復(fù)用機(jī)制。
6.避免設(shè)置控件的圓角又厉,防止離屏渲染九府。
7.避免設(shè)置控件的透明度alpha
。
8.對(duì)于UILabel
的顯示覆致,避免設(shè)置富文本侄旬。
9.UI的布局最好不要用Xib和SB,反正系統(tǒng)做一些不必要的操作煌妈,最好手動(dòng)布局儡羔。
10.避免代理方法里面文字size
的計(jì)算。
四.weak
的內(nèi)部實(shí)現(xiàn)
weak
表明屬性是一種非擁有關(guān)系璧诵,為這種屬性設(shè)置新值時(shí)汰蜘,設(shè)置方法既不保留新值,也不釋放舊值腮猖。此特性與assign
類(lèi)似鉴扫,但是當(dāng)所指的對(duì)象的引用計(jì)數(shù)為0時(shí),會(huì)執(zhí)行dealloc
操作,將weak
屬性設(shè)置為nil
runtime
特質(zhì)罐脊,系統(tǒng)會(huì)將所有weak
屬性存在一個(gè)hash
表中,將weak
屬性所指的對(duì)象的內(nèi)存地址作為key
唐片,當(dāng)weak
所指向的對(duì)象被清空時(shí)莱预,系統(tǒng)會(huì)通過(guò)清空對(duì)象的內(nèi)存地址key
柠掂,從hash
表中獲取weak
屬性,將其賦值為nil
依沮。
五.copy
關(guān)鍵字怎么用
1.copy
特質(zhì):父類(lèi)指針可以指向子類(lèi)對(duì)象涯贞,為了保持屬性不受外界的影響,無(wú)論外面給我傳的是可變的或不可變的對(duì)象危喉,都會(huì)保持一份不可變數(shù)據(jù)的副本宋渔。
2.strong
特質(zhì):當(dāng)不可變的對(duì)象指向可變的子類(lèi)對(duì)象時(shí),只是增加了當(dāng)前對(duì)象的引用計(jì)數(shù)辜限,可變的對(duì)象和不可變的對(duì)象指向同樣的地址空間皇拣,當(dāng)可變對(duì)象的值發(fā)生變化時(shí),同時(shí)會(huì)影響不可變的對(duì)象薄嫡。
copy
此特質(zhì)所表達(dá)的所屬關(guān)系與strong
類(lèi)似氧急。然而設(shè)置方法并不保留新值,而是將其“拷貝”毫深,當(dāng)屬性的類(lèi)型為NSString
時(shí)吩坝,經(jīng)常用此特質(zhì)來(lái)保護(hù)其封裝性,因?yàn)閭鬟f給設(shè)置方法的新值有可能指向NSMutableString
類(lèi)的實(shí)例哑蔫,這個(gè)類(lèi)是NSString
的子類(lèi)钉寝,表示一種可修改其值的字符串,此時(shí)若是不拷貝字符串闸迷,那么設(shè)置完屬性之后瘩蚪,字符串的值就可能在對(duì)象不知情的情況下被篡改。所以稿黍,這時(shí)就要拷貝一份不可變的字符串疹瘦,確保對(duì)象中的字符串的值不被無(wú)意間改動(dòng)。只要實(shí)現(xiàn)所用的對(duì)象是可變的巡球,就應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份言沐。
六.事件的傳遞和響應(yīng)
當(dāng)一個(gè)事件發(fā)生后,事件會(huì)從父控件傳給子控件,也就是由UIApplication
->UIWindow
-> UIView
-> initial view
,以上就是事件的傳遞,也就是尋找最合適的view的過(guò)程.
事件的響應(yīng),首先看initial view
能否處理這個(gè)事件,如果不能則會(huì)將事件給其上級(jí)的視圖(initial view
的superView
);如果上級(jí)視圖任然無(wú)法處理則會(huì)繼續(xù)往上傳遞,一直傳遞到視圖控制器view controller
,首先判斷視圖控制器的根視圖view
是否能處理此事件,如果不能則接著判斷該視圖控制器能否處理此事件,如果還是不能則繼續(xù)向上傳遞,(對(duì)于第二個(gè)視圖控制器本身還在另一個(gè)視圖控制器中,則繼續(xù)交給父視圖控制器的根視圖,如果根視圖不能處理則交給父視圖控制器處理),一直到window
,如果window
還是不能處理此事件則繼續(xù)交給UIApplication
去處理,如果最后UIApplication
還是不能處理此事件則將其丟棄.
區(qū)別:事件的傳遞是從上到下(父控件到子控件),事件的響應(yīng)是從下到上(順澤響應(yīng)鏈條向上傳遞),子控件到父控件.
七.動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別
在實(shí)際的編程過(guò)程中,通常會(huì)把一些公用的函數(shù)制作成函數(shù)庫(kù),供其它程序使用,一是提高了代碼的復(fù)用,二則提高了核心技術(shù)的保密程度.所以在實(shí)際的項(xiàng)目中經(jīng)常會(huì)使用到函數(shù)庫(kù),即函數(shù)庫(kù)又分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù).這里所謂的動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)是相對(duì)編譯期和運(yùn)行期的.
靜態(tài)庫(kù)在程序編譯時(shí)會(huì)被鏈接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要改靜態(tài)庫(kù).
動(dòng)態(tài)庫(kù)在程序編譯期間不會(huì)被鏈接到目標(biāo)代碼中,只是在程序運(yùn)行時(shí)才被載入,在程序運(yùn)行期間還需要?jiǎng)討B(tài)庫(kù)的存在.
八.runtime的介紹
runtime
是一套底層C語(yǔ)言的API
,包含許多強(qiáng)大的C語(yǔ)言函數(shù),OC的函數(shù)調(diào)用,底層都會(huì)調(diào)用runtime
函數(shù).
作用:可以獲取當(dāng)前對(duì)象的所有成員變量,方法名;可以動(dòng)態(tài)的給對(duì)象添加屬性和方法.利用黑魔法(Method Swizzling
)交換兩個(gè)方法的實(shí)現(xiàn)等.
objc_setAssociatedObject
給關(guān)聯(lián)對(duì)象添加屬性
objc_getAssociatedObject
獲取關(guān)聯(lián)對(duì)象的屬性
九.什么時(shí)候會(huì)報(bào)unrecognized selector
的異常
objc
在向一個(gè)對(duì)象發(fā)送消息時(shí),runtime
庫(kù)會(huì)根據(jù)對(duì)象的isa指針找到該對(duì)象實(shí)際所屬的類(lèi),然后在該類(lèi)中的方法列表及其父類(lèi)的方法列表中尋找方法的運(yùn)行,如果最頂層的方法中依然找不到相應(yīng)的方法時(shí),程序在運(yùn)行時(shí)會(huì)掛掉同時(shí)拋出異常unrecognized selector sent to XXX
.但是在這之前,objc的運(yùn)行時(shí)會(huì)給出三次拯救程序奔潰的的機(jī)會(huì):
1.Method resolution
objc運(yùn)行時(shí)會(huì)調(diào)用+resolveInstanceMethod:
或+resolveClassMethod:
,讓你有機(jī)會(huì)提供一個(gè)函數(shù)實(shí)現(xiàn).如果你添加了函數(shù),運(yùn)行系統(tǒng)會(huì)重新啟動(dòng)一次消息發(fā)送的過(guò)程.否則,運(yùn)行時(shí)會(huì)移到下一步,消息轉(zhuǎn)發(fā)(message Forwarding
)
2.Fast forwarding
如果目標(biāo)對(duì)象實(shí)現(xiàn)了-forwardingTargetForSelector:
,runtime
這時(shí)就會(huì)調(diào)用這個(gè)方法,給你把消息轉(zhuǎn)發(fā)到其它對(duì)象的機(jī)會(huì).只要這個(gè)方法返回的不是nil和self,整個(gè)消息發(fā)送的過(guò)程就會(huì)重啟,發(fā)送的對(duì)象就會(huì)變成你返回的那個(gè)對(duì)象.否則,就會(huì)繼續(xù)Normal Forwarding
.
3.Normal Forwarding
這一步是runtime
最后一次給你挽救的機(jī)會(huì),首先它會(huì)發(fā)送-methodSignatureForSelector:
消息獲得函數(shù)的參數(shù)和返回值類(lèi)型.如果-methodSignatureForSelector:
返回的是nil
,runtime
就會(huì)發(fā)出-doesNotRecognizeSelector:
消息,程序這時(shí)也就掛掉了.如果返回了一個(gè)函數(shù)簽名,runtime
就是創(chuàng)建一個(gè)NSIvocation
對(duì)象并發(fā)送-forwardInvocation:
消息給目標(biāo)對(duì)象.
十.UIView
和CALayer
的區(qū)別和聯(lián)系
1.UIView
可以響應(yīng)事件,CALayer
不可以
UIView
繼承自UIResponder
,具有響應(yīng)事件的能力.
2.UIView
主要是對(duì)顯示內(nèi)容的管理而CALayer
主要是側(cè)重對(duì)顯示的繪制.
3.在iOS
動(dòng)畫(huà)的時(shí)候,修改非RootLayer
的屬性會(huì)默認(rèn)產(chǎn)生隱式動(dòng)畫(huà),而修改UIView
則不會(huì).
目前先整理這些,貌似都是些概率的東西,后續(xù)待繼續(xù)更新...
若有好的面試題目,待各位在評(píng)論中指出,表示會(huì)及時(shí)更新上去.自己也會(huì)在平時(shí)的開(kāi)發(fā)中多積累一些...
整理多了,也是一份不錯(cuò)的筆記...
收獲自己,分享大家...