1.談一談IOS內(nèi)存管理機(jī)制。
IOS內(nèi)存管理機(jī)制的原理是引用計(jì)數(shù),當(dāng)這塊內(nèi)存被創(chuàng)建后引用計(jì)數(shù)加1,這時(shí)若果有另一個(gè)對(duì)象或指針指向這塊內(nèi)存巡揍,那么引用計(jì)數(shù)再加1实苞,之后如果有一個(gè)對(duì)象不再指向這塊內(nèi)存缭受,則引用計(jì)數(shù)減1分瘾,最后當(dāng)不在有對(duì)象或指針指向這塊內(nèi)存,引用計(jì)數(shù)變?yōu)?紊婉,則這塊內(nèi)存被釋放药版。
copy和strong都修飾對(duì)象,
strong修飾的nsstring喻犁,屬于淺拷貝槽片,不會(huì)開辟新內(nèi)存,會(huì)根據(jù)原數(shù)據(jù)的改變而改變肢础,一般修飾可變數(shù)據(jù)还栓。
copy修飾的nssting,屬于深拷貝传轰,會(huì)開辟新的內(nèi)存剩盒,不會(huì)根據(jù)原數(shù)據(jù)的改變而改變。一般修飾不可變數(shù)據(jù)慨蛙。
assign辽聊,弱引用纪挎,修飾基本數(shù)據(jù)類型,也可修飾對(duì)象跟匆,但是會(huì)產(chǎn)生野指針异袄。
weak,弱引用玛臂,只可修飾對(duì)象烤蜕。
2,vc的生命周期迹冤。
loadView
viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidAppear
viewWillDisAppear
viewDidDisAppear
dealloc
3讽营,kvc和kvo的實(shí)現(xiàn)原理。
KVC : 鍵值編碼(Key-Value Coding),它是一種通過key值訪問類屬性的機(jī)制叁巨,其中 KVC 原理:當(dāng)調(diào)用- (void)setValue:(id)value forKey:(NSString *)key時(shí)斑匪,KVC底層的執(zhí)行機(jī)制如下:先搜索對(duì)應(yīng)屬性的setter方法,如果沒有搜索到锋勺,就查找_key,_isKey狡蝶,key庶橱,isKey,最后賦值贪惹。
KVO:對(duì)監(jiān)聽的類會(huì)生成一個(gè)它的派生子類苏章,然后重寫了被觀察屬性setter方法,當(dāng)屬性發(fā)生改變時(shí)奏瞬,發(fā)送通知獲取到屬性的更改情況枫绅。
4,Runloop硼端。
主線程的默認(rèn)就有了 Runloop并淋。
一個(gè)線程對(duì)應(yīng)一個(gè) Runloop。
Runloop 存儲(chǔ)在一個(gè)全局的可變字典里珍昨,線程是 key 县耽,Runloop 是 value。
RunLoop的運(yùn)行模式共有5種镣典,RunLoop只會(huì)運(yùn)行在一個(gè)模式下兔毙,要切換模式,就要暫停當(dāng)前模式兄春,重寫啟動(dòng)一個(gè)運(yùn)行模式澎剥。
-kCFRunLoopDefaultMode, App的默認(rèn)運(yùn)行模式,通常主線程是在這個(gè)運(yùn)行模式下運(yùn)行
- UITrackingRunLoopMode, 跟蹤用戶交互事件(用于 ScrollView 追蹤觸摸滑動(dòng)赶舆,保證界面滑動(dòng)時(shí)不受其他Mode影響)
- kCFRunLoopCommonModes, 偽模式哑姚,不是一種真正的運(yùn)行模式
- UIInitializationRunLoopMode:在剛啟動(dòng)App時(shí)第進(jìn)入的第一個(gè)Mode趾唱,啟動(dòng)完成后就不再使用
- GSEventReceiveRunLoopMode:接受系統(tǒng)內(nèi)部事件,通常用不到
Runloop的作用:
1蜻懦,處理crash甜癞,在主線程中調(diào)用堆棧中異常信號(hào),當(dāng)捕獲到異常信號(hào)的時(shí)候宛乃,用Runloop保住線程悠咱,以致于程序不會(huì)立馬crash
2,線程闭髁叮活 子線程方法中添加runloop析既。
3,檢測 優(yōu)化卡頓 將observer添加到主線程谆奥,將Timer添加到子線程的runloop中
5眼坏,runtime。
Runtime是iOS核心運(yùn)行機(jī)制之一酸些,iOS App加載庫宰译、加載類、執(zhí)行方法調(diào)用魄懂,全靠Runtime沿侈。
runtime是一套比較底層的純C語言API, 屬于一個(gè)C語言庫, 包含了很多底層的C語言API。
在我們平時(shí)編寫的OC代碼中, 程序運(yùn)行過程時(shí), 其實(shí)最終都是轉(zhuǎn)成了runtime的C語言代碼市栗。
objc_msgSend : 給對(duì)象發(fā)送消息
class_copyMethodList : 遍歷某個(gè)類所有的方法
class_copyIvarList : 遍歷某個(gè)類所有的成員變量
runtime具體應(yīng)用
利用關(guān)聯(lián)對(duì)象(AssociatedObject)給分類添加屬性
遍歷類的所有成員變量(修改textfield的占位文字顏色缀拭、字典轉(zhuǎn)模型、自動(dòng)歸檔解檔)
動(dòng)態(tài)交換方法實(shí)現(xiàn)(交換系統(tǒng)的方法)
利用消息轉(zhuǎn)發(fā)機(jī)制解決方法找不到的異常問題
KVC 字典轉(zhuǎn)模型
消息轉(zhuǎn)發(fā)機(jī)制:有3個(gè)階段填帽,消息發(fā)送蛛淋,動(dòng)態(tài)解析方法,消息轉(zhuǎn)發(fā)篡腌。
消息發(fā)送:當(dāng)調(diào)用某個(gè)對(duì)象的方法的時(shí)候褐荷,會(huì)通過isa指針找到該類的cache緩存列表中查找,如果沒有找到就去方法列表中查找哀蘑,如果還沒有找到就去他的父類中查找诚卸,直到最后查找到后為nil。
然后就調(diào)用動(dòng)態(tài)解析方法绘迁。
是指在運(yùn)行時(shí)通過類的resolvemethd方法動(dòng)態(tài)為這個(gè)這個(gè)方法創(chuàng)建實(shí)現(xiàn)合溺,如果還是沒有找到,
就通過消息轉(zhuǎn)發(fā)缀台,把這個(gè)消息發(fā)送給其他對(duì)象來找這個(gè)方法棠赛。最后還沒找到,就會(huì)拋出異常。
6睛约,多線程鼎俘。
NsTread,屬于輕量級(jí)的,需要手動(dòng)管理線程周期辩涝。
GCD贸伐,是基于c語言的線程,自動(dòng)管理線程周期怔揩。
NSOpreation捉邢,是基于GCD封裝的,具有更多的功能商膊。
串行同步伏伐,不需要開辟線程,一個(gè)一個(gè)執(zhí)行晕拆。
串行異步藐翎,不需要開辟新的線程,一起執(zhí)行实幕。
并行同步吝镣,開辟新的線程,一個(gè)一個(gè)執(zhí)行茬缩。
并行異步赤惊,開辟新的線程,一起執(zhí)行凰锡。
兩個(gè)子線程,需要同步執(zhí)行圈暗,需要使用信號(hào)量掂为,線程鎖,柵欄员串。
多個(gè)子線程全部執(zhí)行完勇哗,在進(jìn)入子線程,使用線程組寸齐,groupEnter欲诺,GroupLeave
7、動(dòng)態(tài)庫與靜態(tài)庫的區(qū)別渺鹦。
編譯方式不同扰法。
靜態(tài)庫是在編譯時(shí)將庫的代碼打包到可執(zhí)行程序中,
動(dòng)態(tài)庫則是在運(yùn)行時(shí)動(dòng)態(tài)加載到程序中的毅厚。
內(nèi)存使用方式不同塞颁。
靜態(tài)庫的代碼被打包進(jìn)了可執(zhí)行程序中,所以不額外占用內(nèi)存。
動(dòng)態(tài)庫的代碼在程序運(yùn)行時(shí)才會(huì)被加載到內(nèi)存中祠锣,會(huì)占用額外內(nèi)存酷窥,但是可以被多個(gè)程序使用,從而又節(jié)省了內(nèi)存伴网。
更新和維護(hù)方式不同蓬推。
靜態(tài)庫的代碼被打包成可執(zhí)行程序的一部分,因此靜態(tài)庫的更新和維護(hù)需要重新進(jìn)行編譯和部署澡腾;
動(dòng)態(tài)庫可以獨(dú)立于程序進(jìn)行更新沸伏,因?yàn)閯?dòng)態(tài)庫作為一個(gè)單獨(dú)的文件存在于系統(tǒng)中,可以被多個(gè)程序共享蛋铆。
8馋评、Http與Https
1.Http是超文本傳輸協(xié)議,數(shù)據(jù)明文傳輸刺啦,所以會(huì)被抓包導(dǎo)致信息泄露留特,有安全風(fēng)險(xiǎn)問題!
2.Https 則是具有安全性的SSL加密傳輸協(xié)議玛瘸。(http和TCP 之間加了一層TSL 或者 SSL的安全層)
3.Http和Https使用的是完全不同的連接方式用的端口也不一樣,前者是80,后者是443蜕青。
4.Http的連接很簡單,是無狀態(tài)的。
5.HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸糊渊、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議右核。
6.Https協(xié)議需要到CA付費(fèi)申請(qǐng)證書,
9、對(duì)稱加密和非對(duì)稱加密
對(duì)稱加密算法是指加密和解密使用相同的密鑰的加密算法渺绒。
常見的對(duì)稱加密算法有DES贺喝、AES。效率高快宗兼。
非對(duì)稱加密算法是指加密和解密使用不同的密鑰的加密算法躏鱼。在非對(duì)稱加密中,發(fā)送方使用公鑰將明文加密為密文殷绍,接收方使用私鑰將密文解密為明文染苛。常見的非對(duì)稱加密算法有RSA、ElGamal等主到。更安全茶行。
10、面向?qū)ο箝_發(fā)登钥。封裝畔师,繼承,多態(tài)怔鳖。
11茉唉、啟動(dòng)速度優(yōu)化固蛾。
1.是減少系統(tǒng)依賴庫
2.減少自己需要加入的各種三方庫(庫越少dyld加載的速度越快,就能越早的返回程序入口main函數(shù)的地址)
3.有一些自己加入的庫度陆,能選擇靜態(tài)庫就選擇靜態(tài)庫艾凯,少用動(dòng)態(tài)庫,因?yàn)閯?dòng)態(tài)庫的加載方式比靜態(tài)庫慢懂傀。如果必須依賴動(dòng)態(tài)庫趾诗,則把多個(gè)非系統(tǒng)的動(dòng)態(tài)庫合并成一個(gè)動(dòng)態(tài)庫。
4.使用appCode檢查項(xiàng)目中蹬蚁,那些類和方法沒有使用到恃泪。 把沒有使用到的刪除
5.圖片資源壓縮到最小,因?yàn)樵趩?dòng)加載時(shí)會(huì)加載資源圖片進(jìn)行IO操作犀斋。所以圖片小加載速度也會(huì)顯著提升贝乎。
6.內(nèi)存上優(yōu)化:類和方法名不要太?。
12.mvc和mvvm的區(qū)別叽粹。
mvc览效,model處理數(shù)據(jù)邏輯,view負(fù)責(zé)數(shù)據(jù)展示虫几,controller負(fù)責(zé)處理用戶交互連接model和view锤灿,是單向傳輸。
mvvm辆脸,MVVM由Model(模型)但校、View(視圖)和ViewModel(視圖模型)組成,MVVM實(shí)現(xiàn)數(shù)據(jù)的雙向綁定啡氢,View和ViewModel之間可以通過數(shù)據(jù)綁定實(shí)現(xiàn)雙向通信状囱。MVVM模式將視圖和業(yè)務(wù)邏輯分離,提高了代碼的可重用性和測試性倘是。