1、git add 和 git commit 的區(qū)別
git add # 從工作區(qū)被提交到暫存區(qū),但此時(shí)文件并沒(méi)有真正進(jìn)入到版本庫(kù)當(dāng)中墅茉,文件目前只處于一個(gè)中間狀態(tài)伟阔。
git commit # 這個(gè)命令將處于中間狀態(tài)的文件(暫存區(qū)的文件)提交到版本庫(kù)中,這時(shí)才算真正完成了一次提交過(guò)程。
2筹淫、JS交互的原理是什么
# native直接調(diào)用js的方法:
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
# JS直接調(diào)用native的方法
其實(shí),UIWebView并沒(méi)有提供JS調(diào)用native的方法呢撞,但是我們卻可以通過(guò)間接的方法來(lái)實(shí)現(xiàn)這樣的操作损姜。總結(jié)看來(lái)殊霞,間接實(shí)現(xiàn)的方式有三種:
1. 在代理方法攔截Url,識(shí)別判斷
2. Block傳值,實(shí)現(xiàn)JS調(diào)用OC
3. 模型實(shí)現(xiàn)摧阅,JS直接用oc方法名來(lái)調(diào)用oc方法
4. 使用第三方工具類(lèi):WebViewJavascriptBridge
鏈接:http://www.reibang.com/p/bdd340b46076
3、為什么說(shuō)HTTP請(qǐng)求是短連接绷蹲,怎樣才能實(shí)現(xiàn)HTTP長(zhǎng)連接
# 短連接
在HTTP/1.0中棒卷,默認(rèn)使用的是短連接。
也就是說(shuō)祝钢,瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作比规,就建立一次連接,但任務(wù)結(jié)束就中斷連接拦英。
如果客戶(hù)端瀏覽器訪(fǎng)問(wèn)的某個(gè)HTML或其他類(lèi)型的 Web頁(yè)中包含有其他的Web資源苞俘,如JavaScript文件、圖像文件龄章、CSS文件等吃谣;當(dāng)瀏覽器每遇到這樣一個(gè)Web資源,就會(huì)建立一個(gè)HTTP會(huì)話(huà)做裙。
# 長(zhǎng)連接
但從 HTTP/1.1起岗憋,默認(rèn)使用長(zhǎng)連接,用以保持連接特性锚贱。使用長(zhǎng)連接的HTTP協(xié)議仔戈,會(huì)在響應(yīng)頭有加入這行代碼:
Connection:keep-alive
客戶(hù)端的長(zhǎng)連接不可能無(wú)限期的拿著,會(huì)有一個(gè)超時(shí)時(shí)間,服務(wù)器有時(shí)候會(huì)告訴客戶(hù)端超時(shí)時(shí)間监徘,譬如:
Keep-Alive: timeout=20晋修,表示這個(gè)TCP通道可以保持20秒。
另外還可能有max=XXX凰盔,表示這個(gè)長(zhǎng)連接最多接收XXX次請(qǐng)求就斷開(kāi)墓卦。
對(duì)于客戶(hù)端來(lái)說(shuō),如果服務(wù)器沒(méi)有告訴客戶(hù)端超時(shí)時(shí)間也沒(méi)關(guān)系户敬,
服務(wù)端可能主動(dòng)發(fā)起四次握手?jǐn)嚅_(kāi)TCP連接落剪,
客戶(hù)端能夠知道該TCP連接已經(jīng)無(wú)效;
另外TCP還有心跳包來(lái)檢測(cè)當(dāng)前連接是否還活著尿庐,方法很多忠怖,避免浪費(fèi)資源。
在使用長(zhǎng)連接的情況下抄瑟,當(dāng)一個(gè)網(wǎng)頁(yè)打開(kāi)完成后凡泣,客戶(hù)端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的 TCP連接不會(huì)關(guān)閉,
如果客戶(hù)端再次訪(fǎng)問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè)皮假,會(huì)繼續(xù)使用這一條已經(jīng)建立的連接问麸。
Keep-Alive不會(huì)永久保持連接,它有一個(gè)保持時(shí)間钞翔,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間。實(shí)現(xiàn)長(zhǎng)連接要客戶(hù)端和服務(wù)端都支持長(zhǎng)連接席舍。
# HTTP協(xié)議的長(zhǎng)連接和短連接布轿,實(shí)質(zhì)上是TCP協(xié)議的長(zhǎng)連接和短連接。
容易混淆的概念——TCP的keep alive和HTTP的Keep-alive
TCP的keep alive是檢查當(dāng)前TCP連接是否活著来颤;HTTP的Keep-alive是要讓一個(gè)TCP連接活久點(diǎn)汰扭。它們是不同層次的概念。
TCP keep alive的表現(xiàn):當(dāng)一個(gè)連接“一段時(shí)間”沒(méi)有數(shù)據(jù)通訊時(shí)福铅,一方會(huì)發(fā)出一個(gè)心跳包(Keep Alive包)萝毛,如果對(duì)方有回包則表明當(dāng)前連接有效,繼續(xù)監(jiān)控滑黔。
這個(gè)“一段時(shí)間”可以設(shè)置笆包。
# 長(zhǎng)連接和短連接的優(yōu)點(diǎn)和缺點(diǎn)
長(zhǎng)連接:長(zhǎng)連接可以省去較多的TCP建立和關(guān)閉的操作,減少浪費(fèi)略荡,節(jié)約時(shí)間庵佣。對(duì)于頻繁請(qǐng)求資源的客戶(hù)來(lái)說(shuō),較適用長(zhǎng)連接汛兜。
Client 與 server 之間的連接如果一直不關(guān)閉的話(huà)巴粪,會(huì)存在一個(gè)問(wèn)題,隨著客戶(hù)端連接越來(lái)越多,server早晚有扛不住的時(shí)候
短連接:短連接對(duì)于服務(wù)器來(lái)說(shuō)管理較為簡(jiǎn)單肛根,存在的連接都是有用的連接辫塌,不需要額外的控制手段。
但如果客戶(hù)請(qǐng)求頻繁派哲,將在 TCP 的建立和關(guān)閉操作上浪費(fèi)時(shí)間和帶寬臼氨。
4、Object-C Category和Extension的區(qū)別
# Category
用于給class及其subclass添加新的方法
有自己?jiǎn)为?dú)的 .h 和 .m 文件
用于添加新方法狮辽,而不能添加新屬性(property)
# Extension
Extension常被稱(chēng)為是匿名的Category
用于給類(lèi)添加新方法一也,但只作用于原始類(lèi),不作用于subclass
只能對(duì)有implementation源代碼的類(lèi)寫(xiě)Extension喉脖,對(duì)于沒(méi)有implementation源代碼的類(lèi)椰苟,比如framework class,是不可以的
Extension可以給原始類(lèi)添加新方法树叽,以及新屬性
5舆蝴、swift中Class和結(jié)構(gòu)體的區(qū)別
* 類(lèi)是引用類(lèi)型,結(jié)構(gòu)體是值類(lèi)型,不能使用===/!== 判斷地址
* 類(lèi)可以繼承,結(jié)構(gòu)體不能繼承
* 結(jié)構(gòu)體沒(méi)有deinit 方法
* 創(chuàng)建結(jié)構(gòu)體要比創(chuàng)建對(duì)象速度快
* 創(chuàng)建相同屬性的結(jié)構(gòu)體比類(lèi)更加節(jié)省內(nèi)存
* 在數(shù)據(jù)量比較大的排序中,結(jié)構(gòu)體排序的速度比較慢,因?yàn)榻Y(jié)構(gòu)體是值類(lèi)型,排序的時(shí)候,需要大量的賦值運(yùn)算。而對(duì)象只需要交換地址即可题诵。
4洁仗、多線(xiàn)程處理都具體用在了什么地方
* 多圖片上傳使用到了 NSOperationQueue + NSBlockOperation
* dispatch_async(dispatch_get_main_queue(), ^{});用在了下載視頻、音樂(lè)下載性锭、直播IM等功能上更新UI
* NSThread用在了JS交互上赠潦,用來(lái)判斷是否是主線(xiàn)程 if ([[NSThread currentThread] isMainThread])
5、DB-ORM框架設(shè)計(jì)
* 所謂ORM草冈,即對(duì)象-關(guān)系映射(Object/Relation Mapping)她奥,方便我們以操作對(duì)象的方式去操作關(guān)系型數(shù)據(jù)庫(kù)。
* 將一個(gè)SQL語(yǔ)句以面向?qū)ο蠓绞竭M(jìn)行設(shè)計(jì)怎棱,構(gòu)建者模式動(dòng)態(tài)構(gòu)建表哩俭。
* 共包括五個(gè)模塊,分別是數(shù)據(jù)庫(kù)連接對(duì)象拳恋、構(gòu)建SQL語(yǔ)句凡资、構(gòu)建創(chuàng)建表、操作表谬运、附加功能(排序隙赁、修改重命名、條件篩選梆暖、增加字段鸳谜、刪除字段等)
* 整個(gè)框架設(shè)計(jì)基于構(gòu)建者模式,迭代器模式遍歷表字段
6式廷、響應(yīng)式編程框架設(shè)計(jì)
* 響應(yīng)式編程可以加深你代碼抽象的程度咐扭,讓你可以更專(zhuān)注于定義與事件相互依賴(lài)的業(yè)務(wù)邏輯,而不是把大量精力放在實(shí)現(xiàn)細(xì)節(jié)上,同時(shí)蝗肪,使用響應(yīng)式編程還能讓你的代碼變得更加簡(jiǎn)潔袜爪。
* 特別對(duì)于現(xiàn)在流行的webapps和mobile apps,它們的 UI 事件與數(shù)據(jù)頻繁地產(chǎn)生交互薛闪,在開(kāi)發(fā)這些應(yīng)用時(shí)使用響應(yīng)式編程的優(yōu)點(diǎn)將更加明顯辛馆。
7、MVP框架設(shè)計(jì)
* MVP分為Model豁延、View昙篙、Presenter三層:
* Model作為模型層,在MVP中更偏向于功能的模型诱咏,負(fù)責(zé)對(duì)數(shù)據(jù)的存取操作苔可,例如對(duì)數(shù)據(jù)庫(kù)的讀寫(xiě),網(wǎng)絡(luò)的數(shù)據(jù)的請(qǐng)求等袋狞;
* View作為視圖層焚辅,代表著布局和控件;
* Presenter作為主持層苟鸯,也就是主持著View與Model之間的交互同蜻。
* MVP框架中,斷絕了View與Model之間的直接交互早处,成功的減少了controller中的臃腫代碼湾蔓,使得controller能夠保持整潔清晰。