1. 內(nèi)存管理
? ? ? ? 在iOS 開發(fā)中, 使用引用計(jì)數(shù)來管理OC對象的內(nèi)存,新創(chuàng)建的OC對象的引用計(jì)數(shù)是1. 調(diào)用retain會是oc對象引用計(jì)數(shù)+1, 調(diào)用release會使oc對象的引用計(jì)數(shù)+1. 但引用計(jì)數(shù)減為0時, OC對象就會銷毀, 釋放占用內(nèi)存空間. 當(dāng)使用nwe, copy, mutableCopy, alloc方法返回了一個對象時, 在不需要這個對象時, 要使用release或者aoturelease釋放掉
2.深拷貝與淺拷貝
? ? ? ? copy淺拷貝, 不拷貝對象本身, 僅僅拷貝指向?qū)ο蟮闹羔? ? ?mutableCopy深拷貝, 是直接拷貝整個對象內(nèi)存到另一塊內(nèi)存中去, 淺拷貝不拷貝對象本身, 僅僅拷貝對象的指針, 深拷貝, 是直接拷貝整個對象到另一塊內(nèi)存中, 用copy修飾的或者賦值的變量肯定是不可變的, 用copy賦值, 要看源對象是否是可變的, 來決定只拷貝指針, 還是也拷貝對象到另一塊內(nèi)存空間, 對象之間mutablecopy賦值, 很定會拷貝還在呢個對象內(nèi)存到另一塊內(nèi)存中, 對象之間賦值之后, 在改變, 遵循互不影響原則, 準(zhǔn)則: 不可變對象的copy方法是淺拷貝, 其余的都是深拷貝.
3.weak指針實(shí)現(xiàn)原理
? ? ? ? weak表示的是一個弱引用, 這個引用不會增加對象的引用計(jì)數(shù), 并且在所指向的對象被釋放之后, weak指針會被設(shè)置成為nil, weak引用通常是處理循環(huán)引用的問題, 所引用對象的計(jì)數(shù)器不會+1, 并在引用對象被釋放的時候自動被設(shè)置為nil. MARK: 通常用于解決循環(huán)引用的問題
4. Copy. Strong. Weak. Assign的區(qū)別
assign:?
????1) 用于對基本數(shù)據(jù)類型進(jìn)行賦值操作, 不更改引用計(jì)數(shù).
? ? 2) 也可以用來修飾對象, 但是被assign修飾的對象在釋放后指針的地址還是存在的, 指針并沒有被置為nil, 成為野指針.
? ? 3) 之所以可以用來修飾基本數(shù)據(jù)類型, 是因?yàn)榛緮?shù)據(jù)類型一般分配在棧上棧的內(nèi)存會由系統(tǒng)自動處理, 不會造成野指針
weak:?
????1) 修飾object類型, 修飾的對象在釋放后, 侄子很抵制會被置為nil, 是一種弱引用.
? ? 2) 在ARC環(huán)境下, 為避免循環(huán)引用, 往往會把delegate屬性用weak修飾.
? ? 3) weak和strong不同的是: 當(dāng)一個對象不再有strong類型的指針指向它的時候, 他會被釋放,及時還有weak型指針指向他, 那么這些weak型指針也將被清除.
strong:
? ? 1) ARC模式下的strong 等同于retain都會把對象的引用計(jì)數(shù)+1
copy:
? ? 1) 會在內(nèi)存重拷貝一份對象, 兩個指針指向不同的內(nèi)存地址.
? ? 2) 一般用來修飾NSString等有對應(yīng)可變類型的對象, 因?yàn)樗麄冇锌赡芎蛯?yīng)的可變類型NSMutableString 之間進(jìn)行賦值操作, 為確滨锝幔可變對象變化時對象中的字符串不被修改, 應(yīng)該在設(shè)置屬性時拷貝一份.
? ? 3) 若用strong修飾, 如果可變對象變化, 對象中的字符串屬性也會跟著變化.
5. 進(jìn)程和線程的區(qū)別
????1) 一個線程只能屬于一個進(jìn)程
????2) 一個進(jìn)程可以擁有多個線程, 但至少有一個線程
? ? 3) 線程是操作系統(tǒng)可識別的最小執(zhí)行和調(diào)度單位.
6. 有哪些情況會出現(xiàn)內(nèi)存泄漏
? ? 1) black循環(huán)引用
? ? 2) delegate循環(huán)引用
? ? 3) NSTime循環(huán)引用
? ? 4) 地圖類處理 ?
? ? 5) 線程保活target: self
7. Socket連接和HTTP連接的區(qū)別
????1) HTTP協(xié)議是基于TCP連接的, 是應(yīng)用層協(xié)議, 主要解決如何包裝數(shù)據(jù), Socket是對TCP/IP協(xié)議的封裝, Socket本身并不是協(xié)議, 而是一個調(diào)用接口(API), 通過Socket我們才能使用TCP或ip協(xié)議.
? ? 2) HTTP連接: 短連接, 客戶端向服務(wù)器發(fā)送一次請求, 服務(wù)器響應(yīng)后連接斷開, 節(jié)省資源, 服務(wù)器不能主動給客戶端響應(yīng), IPhone主要使用類NSURLConnection.
? ? 3) Socket連接: 長連接, 客戶端跟服務(wù)器端直接使用Socket進(jìn)行連接, 沒有規(guī)定連接后斷開, 因此客戶端和服務(wù)端保持連接通道, 雙方可以主動發(fā)送數(shù)據(jù).
8. HTTP協(xié)議的特點(diǎn), 關(guān)于HTTP請求GET和POST的區(qū)別
????特點(diǎn):
????????1) HTTP超文本傳輸協(xié)議, 是短連接, 是客戶端主動發(fā)送請求, 服務(wù)器端做出響應(yīng)后, 鏈接斷開.
? ? ? ? 2) HTTP是一個屬于應(yīng)用層面向?qū)ο蟮膮f(xié)議, HTTP有兩類報(bào)文: 請求報(bào)文和響應(yīng)報(bào)文.
? ? ? ? 3) HTTP請求報(bào)文: 一個HTTP請求報(bào)文是由請求行 請求頭部 空行 和請求數(shù)據(jù)四部分組成.
? ? ? ? 4) HTTP響應(yīng)報(bào)文: 是由狀態(tài)行 消息報(bào)頭 響應(yīng)正文.
? ? GET請求 ? ?
? ? ? ? 1) 參數(shù)在地址后拼接, 不安全, 因?yàn)樗袇?shù)都拼接在地址后面是明文, 抓包工具可以看到參數(shù)具體.
? ? ? ? 2) 不適合傳輸大量數(shù)據(jù) 長度有限制, 為1024個字節(jié).
? ? POST請求
? ? ? ? 1) 參數(shù)在請求數(shù)據(jù)區(qū)放著, 相對GET請求更加安全.
? ? ? ? 2) 數(shù)據(jù)大小理論上沒有限制.
? ? ? ? 3) 提交的數(shù)據(jù)放置在HTTP包的報(bào)體中
9. 包體積優(yōu)化 ? ? ? ?
????安裝包瘦(IPA文件): 資源文件以及可執(zhí)行文件
? ? 資源文件(圖片 音頻 視頻等):
? ? ? ? 1) 采取無損壓縮(使用工具).
? ? ? ? 2) 去除沒有用到的資源(https://github.com/tinymind/LSUnusedResources)
? ? 可執(zhí)行文件瘦身:
? ? ? ? 1) 編譯器優(yōu)化 (xcode相關(guān)配置).
? ? ? ? 2) 利用APPcode(https://www.jetbrains.com/objc/)檢測未使用的代碼:菜單欄->Code->Inspect Code
? ? ? ? 3) 可借助第三方工具解析LinkMap文件:?http://github.com/huanxsd/LinkMap
10. nil Nil NULL NSNull的區(qū)別
? ? ? ? 1) nil: 指向一個對象的空指針
? ? ? ? 2) Nil: 指向一個類的空指針.
? ? ? ? 3) NULL: 指向其他類型(例如: 基本類型 C類型) 的空指針, 用于對非對象指針賦空值
? ? ? ? 4) NSNull: 在集合對象中, 標(biāo)識空值的對象.
? 11. assign weak retail strong copy 關(guān)鍵字的區(qū)別
? ? ? ? 1) assign: 用于對基本數(shù)據(jù)類型進(jìn)行賦值操作, 不更改引用計(jì)數(shù), 也可以用來修飾對象, 但是被assign修飾的對象釋放后指針的地址還是存在的, 也就是說指針并沒有被置為nil, 成為野指針, 如果后續(xù)再分配對象到堆上的某塊內(nèi)存時, 正好分到這塊地址, 程序就會crash, 之所可以修飾基本數(shù)據(jù)類型是因?yàn)榛緮?shù)據(jù)類型一般分配在棧上, 棧的內(nèi)存不會有系統(tǒng)自動處理, 不會造成野指針.
? ? ? ? 2) weak: 修飾object類型, 修飾的對象在釋放后, 指針地址會被職位nil, 是一種弱引用, 在ARC環(huán)境下為避免循環(huán)引用, 往往會把delegate屬性用weak修飾. 在MRC下使用assign修飾, weak和strong不同的是: 當(dāng)一個對象不再有strong類型的指針指向它的時候, 他就會被釋放, 即使還有weak型指針指向它, 那么這些weak型指針也將被清除.
? ? ? ? 3) ARC下的strong等同于MRC下的retain都會把引用計(jì)數(shù)+1.
? ? ? ? 4) copy: 會在內(nèi)存里拷貝一份對象, 兩個指針指向不同的內(nèi)存地址, 一般用來修飾NSString等有對應(yīng)可變類型的對象, 因?yàn)樗麄冇锌赡芎蛯?yīng)的可變類型(NSMutableString)之間進(jìn)行賦值操作, 為能確保可變對象變化時, 對象中的字符串不被不修改, 應(yīng)該在設(shè)置屬性時拷貝一份. 而若用strong修飾, 如果可變對象變化, 對象中的字符串屬性也會跟著變化.
? ? ? ? 5) __weak: 只在ARC中使用, 只能修飾對象, 補(bǔ)鞥呢修飾基本數(shù)據(jù)類型(int bool等). 同時, 在ARC下, 要避免black出現(xiàn)循環(huán)引用, 經(jīng)常會__weak typedof(self) weakSelf = self;
12. iOS viewController 生命周期
? ? ? ? 1) viewDidload
? ? ? ? 2) viewWillAppear
? ? ? ? 3) viewDidAppear
? ? ? ? 4) viewWillDisappear
? ? ? ? 5) viewDidDisappear
? ? ? ? 6) dealloc
13. iOS import, include, class, #import "" ?和#import <> 區(qū)別
? ? ? ? 1) #import "" 表示引用自己本地創(chuàng)建的頭文件
? ? ? ? 2) #import <> 表示引用庫文件 (系統(tǒng)文件)
? ? ? ? 3) #import 可以自動防止導(dǎo)入重復(fù)
? ? ? ? 4) 導(dǎo)入objective c 的頭文件時用#import, ?導(dǎo)入c/c++頭文件時使用#include.?
? ? ? ? 5) #include 和#import主要區(qū)別是import 會自動避免重復(fù)導(dǎo)入頭文件, include則需要手動避免重復(fù)導(dǎo)入,?
14. iOS 有哪些設(shè)計(jì)模式
? ? ? ? 1) 單例模式
? ? ? ? ? ? 保證一個類僅有一個實(shí)例, 并提供一個訪問它的全局訪問點(diǎn).
? ? ? ? 2) 代理模式
? ? ? ? ? ? 給某一個對象提供一個代理, 并由代理對象來控制原對象的訪問
? ? ? ? 3) 觀察者模式
? ? ? ? ? ? 定義對象的一種一對多的依賴關(guān)系, 當(dāng)一個對象的狀態(tài)發(fā)生改變時, 所有以來于他的對象都得到通知并自動更新.?
? ? ? ? 4) 工廠方法模式
? ? ? ? ? ? 定義創(chuàng)建對象的接口, 讓子類決定實(shí)例化哪一個類, 工廠方法使的類的實(shí)例化延遲到其子類.