有很長時間沒有整理這些東西了,隨手寄了一些小知識點漠另!以后會不間斷的更新,也歡迎大家隨時補(bǔ)充跃赚。
1笆搓、NSArray與NSSet的區(qū)別?
NSArray內(nèi)存中存儲地址連續(xù),而NSSet不連續(xù)
NSSet效率高满败,內(nèi)部使用hash查找窘奏;NSArray查找需要遍歷
NSSet通過anyObject訪問元素,NSArray通過下標(biāo)訪問
2葫录、NSHashTable與NSMapTable着裹?
NSHashTable是NSSet的通用版本,對元素弱引用米同,可變類型骇扇;可以在訪問成員時copy
NSMapTable是NSDictionary的通用版本,對元素弱引用,可變類型锈候;可以在訪問成員時copy
(注:NSHashTable與NSSet的區(qū)別:NSHashTable可以通過option設(shè)置元素弱引用/copyin饿序,只有可變類型。但是添加對象的時候NSHashTable耗費時間是NSSet的兩倍稍走。
NSMapTable與NSDictionary的區(qū)別:同上)
3、屬性關(guān)鍵字assign柴底、retain婿脸、weak、copy
assign:用于基本數(shù)據(jù)類型和結(jié)構(gòu)體柄驻。如果修飾對象的話狐树,當(dāng)銷毀時,屬性值不會自動置nil鸿脓,可能造成野指針抑钟。
weak:對象引用計數(shù)為0時,屬性值也會自動置nil
retain:強(qiáng)引用類型野哭,ARC下相當(dāng)于strong在塔,但block不能用retain修飾,因為等同于assign不安全拨黔。
strong:強(qiáng)引用類型蛔溃,修飾block時相當(dāng)于copy。
4蓉驹、weak屬性如何自動置nil的城榛?
Runtime會對weak屬性進(jìn)行內(nèi)存布局,構(gòu)建hash表:以weak屬性對象內(nèi)存地址為key态兴,weak屬性值(weak自身地址)為value狠持。當(dāng)對象引用計數(shù)為0 dealloc時,會將weak屬性值自動置nil瞻润。
5喘垂、Block的循環(huán)引用甜刻、內(nèi)部修改外部變量、三種block
block強(qiáng)引用self正勒,self強(qiáng)引用block內(nèi)部修改外部變量:block不允許修改外部變量的值得院,這里的外部變量指的是棧中指針的內(nèi)存地址。__block的作用是只要觀察到變量被block使用章贞,就將外部變量包裹在一個結(jié)構(gòu)體里然后在把棧中的內(nèi)存地址放到堆中祥绞。三種block:NSGlobalBlack(全局)、NSStackBlock(棧block)鸭限、NSMallocBlock(堆block)
6蜕径、KVO底層實現(xiàn)原理?手動觸發(fā)KVO败京?swift如何實現(xiàn)KVO兜喻?
KVO原理:當(dāng)觀察一個對象時,runtime會動態(tài)創(chuàng)建繼承自該對象的類赡麦,并重寫被觀察對象的setter方法朴皆,重寫的setter方法會負(fù)責(zé)在調(diào)用原setter方法前后通知所有觀察對象值得更改,最后會把該對象的isa指針指向這個創(chuàng)建的子類泛粹,對象就變成子類的實例遂铡。
如何手動觸發(fā)KVO:在setter方法里,手動實現(xiàn)NSObject兩個方法:willChangeValueForKey戚扳、didChangeValueForKey
swift的kvo:繼承自NSObject的類忧便,或者直接willset/didset實現(xiàn)族吻。
7帽借、categroy為什么不能添加屬性?怎么實現(xiàn)添加超歌?與Extension的區(qū)別砍艾?category覆蓋原類方法?多個category調(diào)用順序
Runtime初始化時categroy的內(nèi)存布局已經(jīng)確定巍举,沒有ivar脆荷,所以默認(rèn)不能添加屬性。
使用runtime的關(guān)聯(lián)對象懊悯,并重寫setter和getter方法蜓谋。
Extenstion編譯期創(chuàng)建,可以添加成員變量ivar炭分,一般用作隱藏類的信息桃焕。必須要有類的源碼才可以添加,如NSString就不能創(chuàng)建Extension捧毛。
category方法會在runtime初始化的時候copy到原來前面观堂,調(diào)用分類方法的時候直接返回让网,不再調(diào)用原類。如何保持原類也調(diào)用(http://www.reibang.com/p/40e28c9f9da5)师痕。
多個category的調(diào)用順序按照:Build Phases ->Complie Source 中的編譯順序溃睹。
8、load方法和initialize方法的異同胰坟∫蚱——主要說一下執(zhí)行時間,各自用途笔横,沒實現(xiàn)子類的方法會不會調(diào)用父類的惜犀?
load initialize 調(diào)用時機(jī) app啟動后,runtime初始化的時候 第一個方法調(diào)用前調(diào)用 調(diào)用順序 父類->本類->分類 父類->本類(如果有分類直接調(diào)用分類狠裹,本類不會調(diào)用) 沒實現(xiàn)子類的方法會不會調(diào)用父類的 否 是 是否沿用父類實現(xiàn) 否 是
9虽界、對 runtime 的理解√尾ぃ——主要是方法調(diào)用時如何查找緩存莉御,如何找到方法,找不到方法時怎么轉(zhuǎn)發(fā)俗冻,對象的內(nèi)存布局
OC中向?qū)ο蟀l(fā)送消息時礁叔,runtime會根據(jù)對象的isa指針找到對象所屬的類,然后在該類的方法列表和父類的方法列表中尋找方法執(zhí)行迄薄。如果在最頂層父類中沒找到方法執(zhí)行琅关,就會進(jìn)行消息轉(zhuǎn)發(fā):Method resoution(實現(xiàn)方法)、fast forwarding(轉(zhuǎn)發(fā)給其他對象)讥蔽、normal forwarding(完整消息轉(zhuǎn)發(fā)涣易。可以轉(zhuǎn)發(fā)給多個對象)
10冶伞、runtime 中新症,SEL和IMP的區(qū)別?
每個類對象都有一個方法列表,方法列表存儲方法名响禽、方法實現(xiàn)徒爹、參數(shù)類型,SEL是方法名(編號)芋类,IMP指向方法實現(xiàn)的首地址
11隆嗅、autoreleasepool的原理和使用場景?
若干個autoreleasepoolpage組成的雙向鏈表的棧結(jié)構(gòu),objc_autoreleasepoolpush侯繁、objc_autoreleasepoolpop胖喳、objc_autorelease
使用場景:多次創(chuàng)建臨時變量導(dǎo)致內(nèi)存上漲時,需要延遲釋放
autoreleasepoolpage的內(nèi)存結(jié)構(gòu):4k存儲大小
12巫击、Autorelase對象什么時候釋放禀晓?
在沒有手加Autorelease Pool的情況下精续,Autorelease對象是在當(dāng)前的runloop迭代結(jié)束時釋放的,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop粹懒。
13重付、Runloop與線程的關(guān)系?Runloop的mode? Runloop的作用凫乖?內(nèi)部機(jī)制确垫?
每一個線程都有一個runloop,主線程的runloop默認(rèn)啟動帽芽。
mode:主要用來指定事件在運行時循環(huán)的優(yōu)先級
作用:保持程序的持續(xù)運行删掀、隨時處理各種事件、節(jié)省cpu資源(沒事件休息釋放資源)导街、渲染屏幕UI
14披泪、iOS中使用的鎖、死鎖的發(fā)生與避免
@synchronized搬瑰、信號量款票、NSLock等
死鎖:多個線程同時訪問同一資源,造成循環(huán)等待泽论。GCD使用異步線程艾少、并行隊列
15、NSOperation和GCD的區(qū)別
GCD底層使用C語言編寫高效翼悴、NSOperation是對GCD的面向?qū)ο蟮姆庋b缚够。對于特殊需求,如取消任務(wù)鹦赎、設(shè)置任務(wù)優(yōu)先級谍椅、任務(wù)狀態(tài)監(jiān)聽,NSOperation使用起來更加方便钙姊。
NSOperation可以設(shè)置依賴關(guān)系毯辅,而GCD只能通過dispatch_barrier_async實現(xiàn)
NSOperation可以通過KVO觀察當(dāng)前operation執(zhí)行狀態(tài)(執(zhí)行/取消)
NSOperation可以設(shè)置自身優(yōu)先級(queuePriority)。GCD只能設(shè)置隊列優(yōu)先級(DISPATCH_QUEUE_PRIORITY_DEFAULT)煞额,無法在執(zhí)行的block中設(shè)置優(yōu)先級
NSOperation可以自定義operation如NSInvationOperation/NSBlockOperation,而GCD執(zhí)行任務(wù)可以自定義封裝但沒有那么高的代碼復(fù)用度
GCD高效沾谜,NSOperation開銷相對高
16膊毁、oc與js交互
攔截url
JavaScriptCore(只適用于UIWebView)
WKScriptMessageHandler(只適用于WKWebView)
WebViewJavaScriptBridge(第三方框架)
17、swift相比OC有什么優(yōu)勢基跑?
簡潔的語法自動做類型推斷
函數(shù)式編程的支持
可視化互動效果
報錯精準(zhǔn)
定義變量簡單
18婚温、struct、Class的區(qū)別
class可以繼承媳否,struct不可以
class是引用類型栅螟,struct是值類型
struct在function里修改property時需要mutating關(guān)鍵字修飾
19荆秦、訪問控制關(guān)鍵字(public、open力图、private步绸、filePrivate、internal)
public與open:public在module內(nèi)部中吃媒,class和func都可以被訪問/重載/繼承瓤介,外部只能訪問;而open都可以
private與filePrivate:private修飾class/func赘那,表示只能在當(dāng)前class源文件/func內(nèi)部使用刑桑,外部不可以被繼承和訪問;而filePrivate表示只能在當(dāng)前swift源文件內(nèi)訪問
internal:在整個模塊或者app內(nèi)都可以訪問募舟,默認(rèn)訪問級別祠斧,可寫可不寫
class可以繼承,struct不可以
20拱礁、OC與Swift混編
OC調(diào)用swift:import "工程名-swift.h” @objc
swift調(diào)用oc:橋接文件
21梁肿、map、filter觅彰、reduce吩蔑?map與flapmap的區(qū)別?
map:數(shù)組中每個元素都經(jīng)過某個方法轉(zhuǎn)換填抬,最后返回新的數(shù)組(xx.map({$0 * $0}))
flatmap:同map類似烛芬,區(qū)別在flatmap返回的數(shù)組不存在nil,并且會把optional解包飒责;而且還可以把嵌套的數(shù)組打開變成一個([[1,2],[2,3,4],[5,6]] ->[1,2,2,3,4,5,6])
filter:用戶篩選元素(xxx.filter({$0 > 25})赘娄,篩選出大于25的元素組成新數(shù)組)
reduce:把數(shù)組元素組合計算為一個值,并接收初始值()
22宏蛉、guard與defer
guard用于提前處理錯誤數(shù)據(jù)遣臼,else退出程序,提高代碼可讀性
defer延遲執(zhí)行拾并,回收資源揍堰。多個defer反序執(zhí)行,嵌套defer先執(zhí)行外層嗅义,后執(zhí)行內(nèi)層
23屏歹、try、try?與try!
try:手動捕捉異常
try?:系統(tǒng)幫我們處理之碗,出現(xiàn)異常返回nil蝙眶;沒有異常返回對應(yīng)的對象
try!:直接告訴系統(tǒng),該方法沒有異常褪那。如果出現(xiàn)異常程序會crash
24幽纷、@autoclosure:把一個表達(dá)式自動封裝成閉包
25式塌、throws與rethrows:throws另一個throws時,將前者改為rethrows
26友浸、App啟動優(yōu)化策略峰尝?main函數(shù)執(zhí)行前后怎么優(yōu)化
啟動時間 = pre-main耗時+main耗時
pre-main階段優(yōu)化:
刪除無用代碼
抽象重復(fù)代碼
+load方法做的事情延遲到initialize中,或者+load的事情不宜花費太多時間
減少不必要的framework尾菇,或者優(yōu)化已有framework
Main階段優(yōu)化
didFinishLauchingwithOptions里代碼延后執(zhí)行
首次啟動渲染的頁面優(yōu)化
27境析、crash防護(hù)?
unrecognized selector crash
KVO crash
NSNotification crash
NSTimer crash
Container crash(數(shù)組越界派诬,插nil等)
NSString crash (字符串操作的crash)
Bad Access crash (野指針)
UI not on Main Thread Crash (非主線程刷UI (機(jī)制待改善))
28劳淆、內(nèi)存泄露問題?
主要集中在循環(huán)引用問題中默赂,如block沛鸵、NSTime、perform selector引用計數(shù)問題缆八。
29曲掰、UI卡頓優(yōu)化?
30奈辰、架構(gòu)&設(shè)計模式
MVC設(shè)計模式介紹
MVVM介紹栏妖、MVC與MVVM的區(qū)別?
ReactiveCocoa的熱信號與冷信號
緩存架構(gòu)設(shè)計LRU方案
SDWebImage源碼奖恰,如何實現(xiàn)解碼
AFNetWorking源碼分析(觀看優(yōu)秀的框架源碼十分重要)
組件化的實施吊趾,中間件的設(shè)計
哈希表的實現(xiàn)原理?如何解決沖突
31瑟啃、數(shù)據(jù)結(jié)構(gòu)&算法
快速排序论泛、歸并排序
二維數(shù)組查找(每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序蛹屿。請完成一個函數(shù)屁奏,輸入這樣的一個二維數(shù)組和一個整數(shù),判斷數(shù)組中是否含有該整數(shù))
二叉樹的遍歷:判斷二叉樹的層數(shù)
單鏈表判斷環(huán)
32错负、計算機(jī)基礎(chǔ)
http與https坟瓢?socket編程?tcp湿颅、udp载绿?get與post?
tcp三次握手與四次握手
進(jìn)程與線程的區(qū)別
.....
33油航、你平時怎么解決網(wǎng)絡(luò)請求的依賴關(guān)系:當(dāng)一個接口的請求需要依賴于另一個網(wǎng)絡(luò)請求的結(jié)果
辦法1:線程:NSOperation 操作依賴和優(yōu)先級
[operationB addDependency:operationA]; // 操作B依賴于操作</pre>
辦法2:邏輯:在上一個網(wǎng)絡(luò)請求的響應(yīng)回調(diào)中進(jìn)行下一網(wǎng)絡(luò)請求的激活
34、你平時怎么解決網(wǎng)絡(luò)請求的依賴關(guān)系:當(dāng)一個接口的請求需要依賴于另一個網(wǎng)絡(luò)請求的結(jié)果
解析:這個涉及到簡單知識怀浆,可參考 http://www.360doc.com/content/17/0111/22/32626470_621879084.shtml