1 說一下觀察者模式及其應(yīng)用
?? ? 1.1觀察者模式岗喉,對象間存在一種一對多的依賴關(guān)系,則使用觀察者模式虑省,
2 內(nèi)存區(qū)域
? ?2.1 棧區(qū) - 局部變量和實參
? ?2.2 堆區(qū) - OC中使用new方法創(chuàng)建的對象 - 程序員手動申請的空間
? ?2.3 全局區(qū)(靜態(tài)區(qū)) - 沒有初始化的全局變量和靜態(tài)變量 - ?xcode8中存儲全局變量和靜態(tài)變量
? ?2.4?文字常量區(qū)/數(shù)據(jù)段 - 用來存儲已經(jīng)初始化的全局變量衡创,靜態(tài)變量,常量數(shù)據(jù)
? ?2.5 代碼區(qū) - 代碼的二進制文件
3 判斷兩個鏈表是否相交
? ?3.1 長鏈表length - 短鏈表length = mylength
? ?3.2 然后長鏈表走mylength
? ?3.3 然后再一起走看能否相交
4 有N級臺階框舔,每次可以走1步或者兩步問有多少種走法(遞歸)
public int GetStepNum(int n)
{
if(n<1) throw new Exception();
if(n==1) return 1;
if(n==2) return 2;
if(n>2)
return GetStepNum(n-1)+GetStepNum(n-2);
}
另一種快速方法
public static int fib(int n)
{
? ? ? ? if(n<=2)
? ? ? ? ? ? return n;
? ? ? ? int []Memo=new int[n+1];
? ? ? ? Memo[1]=1;
? ? ? ? Memo[2]=2;
? ? ? ? for(int i=3;i<=n;i++)
? ? ? ? {
? ? ? ? ? ? Memo[i]=Memo[i-1]+Memo[i-2];
? ? ? ? }? ? ?
? ? ? ? return Memo[n];
}
5 手寫一個單例 ?
+(instancetype)shareInstance{
staticSignalModel*_instance=nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
_instance=[[SignalModel alloc]init];
});
return_instance;
}
6 Swift相關(guān)知識點?
? ? ? 6.1 Swift語言是用C++編寫的,Swift的核Library使用Swift編寫的。
? ? ? 6.2 Swift使用自動引用計數(shù)(ARC)來簡化內(nèi)存管理记靡,與OC一致。
? ? ? 6.3 相關(guān)快捷函數(shù)
? ? ? Map:
? ? ? varresults = [1,3,5,7]
? ? ? let results = values.map ({ (element) -> Intinreturnelement *2})//"[2, 6, 10, 14]"
? ? ? Filter:數(shù)據(jù)篩選
? ? ? var values = [1,3,5,7,9]
? ? ? let flattenResults = values.filter{ $0%3==0}//[3, 9]
? ? ? Reduce:數(shù)組求和
? ? ? arvalues = [1,3,5]
? ? ? let initialResult =0varreduceResult = values.reduce(initialResult, combine: { (tempResult, element) -> ? ? ?IntinreturntempResult + element
? ? print(reduceResult)//9})
7 ios的手勢事件傳遞
touch傳遞鏈條上的所有手勢識別器都會先于所綁定的view按一定次序開始觸發(fā)狀態(tài)機,不是依次等待上一個識別器有結(jié)果之后出發(fā)下一個,而且即使我們屏蔽了自定義view中touches方法,就是不調(diào)用super,那么手勢識別器一樣會觸發(fā)action,也就是說view里面的touches方法并不影響手勢的識別和事件的分發(fā)团驱,touch事件并不是完全等待至上而下的觸發(fā)先于執(zhí)行有效率優(yōu)勢摸吠。
8 swift優(yōu)勢(雖然現(xiàn)在基本都是問的OC)
? ?8.1類型安全
? ?8.2 語法簡介
9 EXC_BAD_ACCESS野指針危害
? 9.1 指向的內(nèi)存地址沒有被覆蓋
? 9.2 指向的內(nèi)存被覆蓋了?
10 weak和assign的區(qū)別
? ? ? weak主要是修飾對象,對象為引用類型店茶,當(dāng)對象被釋放蜕便,指針就會自動置為nil,不會再指向該內(nèi)存地址,于 weak 對象會放入一個 hash 表中贩幻。 用 weak 指向的對象內(nèi)存地址作為 key轿腺,當(dāng)此對象的引用計數(shù)為 0 的時候會 dealloc两嘴,假如 weak 指向的對象內(nèi)存地址是 a ,那么就會以 a 為鍵族壳, 在這個 weak 表中搜索憔辫,找到所有以 a 為鍵的 weak 對象,從而設(shè)置為 nil仿荆。
? ? ? assign主要是修飾int贰您,float等值類型存在棧中,由系統(tǒng)負責(zé)內(nèi)存管理拢操,修飾對象的話锦亦,對象的內(nèi)存是ARC管理的,如果對象釋放了令境,但是指針沒有置為nil杠园,所以就有野指針的風(fēng)險。
11 runloop知識點
5個類
? ? 11.1CFRunLoopRef -runloop對象
? ? 11.2CFRunLoopModeRef - 包含內(nèi)部四個容器舔庶,source0抛蚁,source1,observe惕橙,timer
? ? 11.3CFRunLoopSourceRef
? ?source0:包括觸摸事件瞧甩,
? ?source1: ?基于Port的線程間通信、系統(tǒng)事件捕捉
? ?? 11.4 CFRunLoopTimerRef -??timer事件弥鹦,包括我們設(shè)置的定時器事件
? ? ?11.5?CFRunLoopObserverRef - 監(jiān)聽者肚逸,Runloop狀態(tài)變更的時,會通知監(jiān)聽者進行函數(shù)回調(diào)惶凝,UI界面的刷新就是在監(jiān)聽到Runloop狀態(tài)為BeforeWaiting時進行的
source0和source1的關(guān)系吼虎,比如點擊了屏幕,先由系統(tǒng)捕捉source1苍鲜,然后判斷事哪個app的思灰,再包裝成source0去處理。
12 Autoreleasepool什么時候回收的內(nèi)存
12.1AutoreleasePool是在RunLoop即將進入RunLoop和準備進入休眠這兩種狀態(tài)的時候被創(chuàng)建和銷毀的混滔,AutoreleasePool銷毀的時候里面被回收的內(nèi)存當(dāng)然就釋放了
12.2是手動調(diào)用AutoreleasePool的釋放方法(drain方法)來銷毀AutoreleasePool
13 UIView的創(chuàng)建和渲染展示過程
?UIKit ->?CoreAnimation的核心動畫 -> openGLE(GPU渲染)洒疚,CoreGraphics(CPU渲染) ->?GraphicsHardWare 圖形硬件
顯示邏輯:
1CoreAnimation提交會話,包括自己和子樹的layout狀態(tài)坯屿。
2 RenderServer解析提交的子樹狀態(tài)油湖,生成繪制指令。
3 GPU執(zhí)行繪制的指令领跛。
4 顯示渲染后的數(shù)據(jù)乏德。
渲染的具體步驟
1 布局--準備視圖的層級關(guān)系,設(shè)置圖層屬性
2 顯示 -- 圖層的寄宿圖片被繪制的階段,涉及到-draweRect和-drawlayer:inContext: 等方法
3 準備 -- 準備發(fā)送動畫數(shù)據(jù)給渲染服務(wù)的階段喊括,比如圖片解碼
4 提交 -- 打包所有圖層和動畫屬性胧瓜,通過IPC發(fā)送到渲染服務(wù)
渲染服務(wù)拿到數(shù)據(jù)后,反序列化成一個叫做渲染樹的圖層樹郑什,使用這個樹狀結(jié)構(gòu)府喳,渲染服務(wù)隊動畫的每一幀做如下動作:
5 對所有的圖層屬性計算中間值,這只openGL幾何形狀(紋理化三角形)來執(zhí)行渲染
6 在屏幕上渲染可見的三角形
?5 蘑拯,6在渲染動畫的過程中是不停的重復(fù)的钝满,前五個階段都在軟件層面處理(通過CPU),只有最后一個被GPU執(zhí)行,而且申窘,你真正只能控制前兩個階段弯蚜,布局和顯示,剩下的在Coreanimation內(nèi)部處理偶洋。
14 NSTimer不準的原因
? 14.1runloop循環(huán)過程中熟吏,被NSTimer觸發(fā)阻塞了,導(dǎo)致循環(huán)不能及時進行下去玄窝,延誤之后NSTimer的觸發(fā)事件
?14.2runloop循環(huán)過程中,在某一時刻主線程發(fā)生了阻賽情況悍引,導(dǎo)致循環(huán)不能及時進行下去恩脂,厭惡NSTimer觸發(fā)時間
?14.3runloop循環(huán)過程中,發(fā)生了模式的轉(zhuǎn)換趣斤,導(dǎo)致遠模式下的NStimer不會正常觸發(fā)