iOS開發(fā)基礎隨筆

1.內存可分為代碼區(qū)、數(shù)據(jù)區(qū)、堆區(qū)和棧區(qū)

·代碼區(qū)用于存放二進制代碼。

·常量區(qū)用于存放常量,靜態(tài)變量和全局變量。

·堆區(qū)一般用來存放OC對象,比如通過alloc或new創(chuàng)建出來的對象,需要由程序員去創(chuàng)建和釋放。

·棧區(qū)一般是在方法內申請的,用于存放局部變量及方法的參數(shù),方法結束時由系統(tǒng)釋放。


2.iOS多線程有哪幾種?

·pthread 運用C語言 可跨平臺使用,線程的生命周期由程序員管理,但使用難度較大實際開發(fā)中幾乎不用。

·NSThread 在使用上更加面向對象 可直接操作線程對象,線程的生命周期由程序員管理,實際開發(fā)中較少使用。

·GCD 為替代NSThread等線程技術,能充分利用設備的多核,自動管理線程的生命周期,實際開發(fā)中使用頻率較高。

·NSOperation 基于GCD再次封裝,相對GCD多了一些實用功能,易用性更高,自動管理線程的生命周期,在實際開發(fā)中使用頻率較高。

GCD 和 NSOperation 的區(qū)別是什么?

·GCD是純C語言的API,NSOperation則是基于GCD封裝的OC版本。

·GCD只支持FIFO(先入先出)的隊列,NSOperation則可以很方便的調整執(zhí)行順序,設置并發(fā)數(shù)量。

·NSOperationQueue可以在各Operation間設置依賴關系,而GCD則較為麻煩。

·NSOperationQueue支持KVO鍵值觀察模式,可以檢測Operation是否正在執(zhí)行(isExecuted),是否結束(isFinisn),是否取消(isCancel)

·GCD 的執(zhí)行速度比 NSOpreation快。

~多線程的并行和并發(fā)區(qū)別:

? ? ·并行:充分利用計算機的多核,在多個線程上同步進行。

? ? ·并發(fā):在一條線程上多個任期間快速交替進行。

適用場景

如果只是為了加快方法的執(zhí)行速度或是一些簡單的使用場景,對隊列中任務依賴關系無要求者可選用輕量級的GCD更為合適。

若是對一組任務之間的依賴關系,或是優(yōu)先級有特殊要求,或者是需要暫停,恢復,取消任務的則選擇 NSOperation 更為合適一些。


3.RunLoop

RunLoop 是線程管理的一種機制 ,簡單來說就是一個處理程序運行過程中出現(xiàn)的各種事件的循環(huán)(觸摸事件,UI刷新事件,定時器事件等)從而保持程序的持續(xù)運行。RunLoop 會在程序沒有事件需要處理的時候,使線程進入休眠狀態(tài),節(jié)省CUP資源,提高性能。

·RunLoop和線程

每個線程都有一個與之對應的RunLoop對象

主線程的RunLoop對象系統(tǒng)在程序的Main函數(shù)中已經(jīng)幫我們創(chuàng)建好了,子線程的RunLoop對象由程序員主動管理。

4.RunTime

運行時機制,使得OC的函數(shù)在編譯期間并不決定調用哪個函數(shù),而是在運行期間才會根據(jù)函數(shù)的名稱找到具體的函數(shù)來調用。

OC中的方法調用在運行時都轉成了objc_msgSend函數(shù)調用,給receiver (方法調用者)發(fā)送了一條消息(函數(shù)的方法名)。

如:[obj show]

在調用時編譯器轉為消息發(fā)送:objc_msgSend(obj, show);

根據(jù)obj的指針獲取obj的class

遍歷class的 method list 找到 show 方法

如果當前class中沒有找到 show 方法,則去class的 super class 中遍歷 method list

找到show方法后就去調用它的實現(xiàn)。

·如果messageSend找不到相應的對象

????如果對象為空,則消息失效

? ? 如果對象不為空,則程序拋出異常。

但 此種方法每次收到消息后都需要遍歷 class 的 method list 效率較低,所以?objc_cache 在找到要調用的方法后 會將 method_name 作為Key ? ? method_imp 作為Value緩存起來,當再次接收到 method_Name的消息的時候 會先從緩存中查找,避免多次遍歷 method List。

RunTime 在開發(fā)中的實際運用

·交換方法的實現(xiàn)。(交換系統(tǒng)某些方法的實現(xiàn),添加校驗)

·KVO的實現(xiàn)也是也是依賴于RunTime機制,當觀察obj對象時,KVO機制會動態(tài)的為obj對象的當前類創(chuàng)建一個子類,并重寫子類obj屬性的setter方法,setter方法會在調用原setter方法之前和之后通知所有觀察屬性值的更改情況。

·訪問和修改類的私有屬性。通過RunTime遍歷類的屬性列表,通過 object_getIvar訪問私有屬性。通過object_setIvar修改私有屬性的值。

·字典轉模型。

·關聯(lián)對象,為分類添加屬性。


5.Http中 get 和 post 的區(qū)別?

·post 用來發(fā)送數(shù)據(jù),get用來接收數(shù)據(jù)。

·參數(shù)放置的位置不通,post放置在 body 中 ?get 放置在url中。

·get傳輸?shù)臄?shù)據(jù)量大小有限制,而理論上來說 post 對參數(shù)的大小是沒有限制的。


6.數(shù)據(jù)的持久化方案有哪些?

·plist文件 將某些特定的類通過XML的格式保存在目錄中(數(shù)組,字典,字符串等)。

·NSUserDefaults ?本地存儲一般用來保存App的偏好設置。

·NSKeyedArchiver 歸檔 ?需遵循 NSCoding 協(xié)議

·數(shù)據(jù)庫 FMDB 相對于蘋果自帶的Core Data 來說更靈活 更輕量級,使用上更加面向對象易用性高。


7.iOS的沙盒機制

·iOS 每個程序都有自己的沙盒,與其它應用的沙盒隔離,應用程序智能訪問自己的沙盒,保證數(shù)據(jù)安全。

·沙盒目錄:


8.iOS的網(wǎng)絡通信方式

·ios 網(wǎng)絡通信的方法有兩大類:使用socket方式進行通信 和 使用asynsocket類庫進行通信,建議使用的時候用asynsocket更好些 因為是別人已經(jīng)封裝好的類庫,比較穩(wěn)定 Socket通信的方法更靈活 因為控制都是自己在做的事情。


9.在網(wǎng)絡請求中如何提高性能?

·減少請求寬帶,使用高效的數(shù)據(jù)交換格式 比如 json。

·壓縮數(shù)據(jù)

·通過緩存響應來避免冗余的網(wǎng)絡請求都會加速應用并改進用戶體驗


10.在網(wǎng)絡請求中如何保證安全性?

·base64 字節(jié)編碼。

·3DES 數(shù)據(jù)加密

·使用https 請求


11.#define和const定義的變量,有什么區(qū)別?

·#define 是宏定義 編譯時不會進行數(shù)據(jù)類型的校驗 運行時 不會為它分配內存。

·#define 定義表達式時需要注意『邊緣效應』

????????比如 #define ?obj ?2+2 ? ? ?int temp = obj / 2 ? ?看起來結果應該是 2 ?但是在編譯期間 obj會被替換為 2+2 ? ?整個表達式為 2+2/2 結果卻等于1 ?因為在定義表達式時?

要注意這樣定義 ????#define obj (2+2)。

·const 定義的常量在編譯是會進行類型校驗,運行是會給它分配內存。


12.什么情況下會出現(xiàn)內存的循環(huán)引用?

·Block block被copy 并retain ?block引用的對象,需要用weak去修飾block引用的對象。

·delegate ?用weak去修飾delegate 否則也可能會出現(xiàn)循環(huán)引用。

·Timer ?在delloc 去執(zhí)行Timer?invalidate 方法,由于Timer未停止所以controller 不會被釋放 因此不會執(zhí)行delloc方法 導致Timer沒有停止,導致循環(huán)引用 。應該在controller的viewDidDisappear 調用 invalidate?方法釋放Timer。


13.block中的weak self,是任何時候都需要加的么?

·并不是,當block 本身并不被 self 持有同時不產(chǎn)生循環(huán)引用的時候就不需要。比如 UIView 的動畫代碼。在這里 UIView的動畫對象持有block ,block 持有self ?而 self 并不持有block 動畫結束時,UIView 會釋放掉block,block會釋放掉 self 所以不會產(chǎn)生循環(huán)引用。


14.GCD的queue,main queue中執(zhí)行的代碼,一定是在main thread么?

·queue ?對于queue中所執(zhí)行的代碼不一定都在主線程中執(zhí)行,如果queue是在主線程中創(chuàng)建的那么就會在主線程中執(zhí)行,如果是在子線程中創(chuàng)建的就會在子線程中執(zhí)行。

·main queue 中的代碼一定會在主線程中執(zhí)行。


15.?.h文件中的變量,外部可以直接訪問么?(注意是變量,不是property)

·成員變量的三種權限 ??@private(私有的) ? ? ? ?

????????????????????????????????????????@protected(受保護的)?

????????????????????????????????????????@public(公共的)

? ? .h文件中的成員變量默認是?protected 權限,外部不可以直接訪問。(知道變量名的情況下可直接用KVC訪問或修改變量,或是直接用RunTime機制遍歷類屬性列表獲取訪問修改變量)


16.?MD5和Base64的區(qū)別是什么,各自場景是什么?

·MD5一般用于密碼的加密、文件校驗,是不可逆的。

·Base64 是一種數(shù)據(jù)編碼格式,可逆 。


17.哪些類不適合使用單例模式,單例模式有什么優(yōu)缺點?

·同一類型的對象在不同場景下會發(fā)生變化的時候不適用于單例。

·優(yōu)點:只創(chuàng)建一次,節(jié)約了系統(tǒng)資源。

·缺點:單例模式中沒有抽象層接口很難擴展,違背了單一原則。


18.代理delegate 通知Notification Block 三者的使用區(qū)別

·delegate 和 block 一般用于一對一的交互通信。

·delegate 需要定于協(xié)議方法,代理對象需要遵循代理,實現(xiàn)協(xié)議方法才能通信。

·block 使用上比較簡潔,但不適用于通信事件較多的場景。

·notification 多用于一對多或是跨模塊通信的場景,代碼可讀性較差。


19,簡單介紹KVC和KVO

·KVC 鍵值編碼 ?間接訪問或修改對象的屬性。(訪問或修改類的私有屬性)

? ? 底層實現(xiàn):當一個對象調用 setValue 方法時:

~查找是否存在相應key 的set方法,如果存在 則直接調用

~如果不存在 則查找與Key相同名稱且?guī)聞澗€的成員變量 如果有 則直接賦值

~如果沒有找到_key 則會查找相同名稱的屬性Key 如果有就直接賦值

~如果還是沒有則會調用?valueForUndefinedKey:和setValue:forUndefinedKey:方法

·KVO 鍵值觀察 觀察某一屬性的方法。 (音樂播放器拖拽進度)

? ? 底層實現(xiàn):

? ? ~給 A 類添加KVO時,runTime


20.簡單介紹下蘋果的推送機制

·安裝了應用的設備需要向蘋果的遠程推送服務器注冊,注冊成功后會獲取一個deviceToken。

·拿到deviceToken后將這個deviceToken上傳到我們的服務器上。

·需要推送消息時,我們的服務器會將推送的消息和需要推送設備的deviceToken發(fā)送到蘋果的遠程推送服務器上。

·蘋果的遠程推送服務器將需要推送的消息發(fā)送到指定的deviceToken 設備上。


21.深拷貝和淺拷貝

·深拷貝是將obj復制了一份存在了新的地址下。

·淺拷貝是將obj的指針復制了一份,而指針指向的還是原來的obj。

對于不可變對象來說 如NSString ? ? copy 為淺拷貝,返回不可變對象 ? ?mutableCopy 為深拷貝,返回可變對象。

對于可變對象來說 ? 如?NSMutableString ? copy 和 ?mutableCopy 都為深拷貝,返回的都為可變對象。

copy: 對于可變對象為深拷貝,對于不可變對象為淺拷貝

mutableCopy:始終是深拷貝


22.類別的作用? 繼承和類別有什么區(qū)別?

·類別可以為類添加新的方法,智能添加不能修改或刪除。如果類別中的方法名和原類中的方法名沖突,則會執(zhí)行類別中的方法。

類別的3個作用:將類的實現(xiàn)分散到多個不用的文件或框架中

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 創(chuàng)建對私有方法的向前引用

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?向對象添加非正式協(xié)議

繼承和類別的區(qū)別:繼承可以增加、修改或是刪除方法,還可以增加屬性。


23.進程與線程的區(qū)別和聯(lián)系?

·進程是系統(tǒng)進行資源分配和調度的一個獨立單位,線程是進程的一個實體。

·進程有自己的獨立的地址控件,有自己的堆棧和局部變量,線程則沒有。

·一個程序至少有一個進程一個進程至少有一個線程。

·進程和線程都是程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應用的并發(fā)性。

·進程和線程的主要差別在于他們是不同的操作系統(tǒng)資源管理方式。


24.定義一個NSString類型的屬性時為什么用copy ?而不用strong ?

·定義為copy時,操作屬性時等同于copy了一份對象,這個指針會指向新生成的copy對象,當使用copy時,無論是拷貝自NSStrong 或是?NSMutableString 其結果都是不可變的NSString。如果使用strong 則當指針指向的對象改變時,屬性值也會發(fā)生相應的改變,導致錯誤。


25.UIView與CALayer的關系

·UIView及負責事件的響應以及內容的展示,UIView是 CALayer的容器。

·CALayer內容的創(chuàng)建。


26.UI卡頓掉幀優(yōu)化

·把以下操作放在子線程中進行

? ? ? ? 對象創(chuàng)建,調整及銷毀

? ? ? ? 預排版(布局計算,文本計算,緩存高度等)

? ? ? ? 預渲染(文本異步繪制,圖片解碼等)


27,nil、NIL、NSNULL 有什么區(qū)別?

·nil 和 NIL ?都代表的是內存中的一塊空地址。

·NSNULL ?代表一個指向nil的空對象。


28,id 和 instanceType 有什么區(qū)別?

·相同點: ?都是指向對象的萬能指針。

·不同點:id類型在編譯的時候不能確定對象的真實類型,instanceType 可以。

? ? ? ? ? ? ? ? ?id可以用來定義變量、參數(shù)類型,返回值類型 而?instanceType 只能用作返回值類型。


29.js和oc互相調用的幾種方式

·js調用oc的三種方法

~根據(jù)網(wǎng)頁重定向截取字符串,通過URLscheme判斷。

~替換方法 context[@"copyText"]

~注入對象 遵守協(xié)議JSExport,設置context

·oc調用js代碼 2種

~通過 WebView 調用 webView stringByEvaluatingJavaScriptFromString: 調用

~通過 JSContext 調用 [context evaluateScript:]


30.為什么block要用copy修飾?

·block 在沒用使用外部變量是 是存儲在內存中的常量區(qū)的,在使用外部變量時 會被存儲到棧區(qū) 當block copy 后是存儲在堆區(qū)的,如果是在棧區(qū) block 隨時有可能被釋放,一但被釋放就會造成野指針程序崩潰,所以要用copy關鍵字。


31.iOS的簽名機制是什么樣的?

·簽名機制

? ? ~先講應用內容通過摘要算法,得到摘要

????~再用私鑰對摘要進行加密,得到密文

? ? ~將源文本、密文和私鑰對應的公鑰一起發(fā)布

·驗證流程

? ? ~查看公鑰是否是私鑰方的

? ? ~用公鑰對密文進行解密得到摘要

? ? ~將APP通過同樣的算法得到摘要進行對比,如果相等 則一切正常。


32.常用的項目架構 ?MVC MVP MVVM?

·MVC (model 、View 、Controller)model 負責處理數(shù)據(jù),View負責展示視圖,controller處理邏輯,model與View之間不能相互通信。

優(yōu)點:降低了各模塊之間的耦合行,提高了view的復用行,代碼邏輯更清晰。

缺點:隨著業(yè)務邏輯的復雜,controller中的邏輯代碼較多,維護較難。

·MVP (Model,View,Presenter) Model 負責處理數(shù)據(jù),View 可以是View或是ViewController,Presenter負責從Model層獲取數(shù)據(jù)傳遞給View。

優(yōu)點:視圖和模型分離,更高效的使用模型。

缺點:Presenter 除了負責業(yè)務邏輯外 也要負責Model-View之間的通信 會導致Presenter層比較臃腫。

·MVVM(Model、Controller / View,ViewModel) View和ViewController都不能直接引用Model,而是引用視圖模型 ViewModel,ViewModel 用來防止用戶輸入驗證邏輯,視圖顯示,網(wǎng)絡請求等邏輯。

優(yōu)點:View可以獨立于Model的變化和修改,一個ViewModel 可以綁定到不用的View上降低了耦合行,提高了復用性。

缺點:過于簡單的項目不適應,大型的項目視圖狀態(tài)較多時,構建和維護成本較大。


33.性能優(yōu)化

·TableView

? ? ~tableViewCell 的重用

????~創(chuàng)建時就布局好,避免頻繁更新UI

? ? ~體檢計算并緩存cell的高度

? ? ~盡可能減少cell中控件的數(shù)量

? ? ~不要使用clearColor 會導致渲染時間變長

? ? ~如果可以局部更新就避免全部更新

? ? ~加載網(wǎng)絡數(shù)據(jù),下載圖片盡量異步加載,并緩存

·如何提高TableView的流暢度

? ? ~對于不必要響應事件的視圖可以考慮用CALayer代替

? ? ~不要頻繁的修改UIView的frame等屬性

? ? ~圖片的大小最好和imageView的大小保持一致

? ? ~盡量將耗時的操作放到子線程中執(zhí)行

? ? ~減少視圖的數(shù)量和層次

·iOS界面保持流暢的技巧

? ? ~預排版 提前計算

? ? ~預渲染,提前繪制

? ? ~異步繪制

? ? ~全局并發(fā)

? ? ~異步加載圖片等

34.如何實現(xiàn)一個自定義對象的深拷貝

·自定義類遵循copy協(xié)議

·實現(xiàn) copyWithZone方法

·在copyWithZone方法中 使用?allocWithZone 創(chuàng)建一個新的對象

·將自定義類中的屬性深拷貝賦值給新創(chuàng)建的對象

·在使用的時候直接調用對象的copy方法即可

35.GCD

·GCD中的2個核心概念 ? 任務 ?和 隊列

·任務

? ? ~任務的執(zhí)行方式有2中 同步執(zhí)行和異步執(zhí)行 ?

? ? ? ? 同步添加任務到指定的隊列中,在添加的任務執(zhí)行結束之前會一直等待,只能在當前線程中執(zhí)行,不具備開啟新線程的能力

? ? ? ? 異步添加任務到執(zhí)行的隊列中,不需要等待,可以繼續(xù)執(zhí)行任務且可以在新線程中執(zhí)行,具備開啟新線程的能力

·隊列

? ?~GCD中的隊列有2中 ?串行 ?和 ?并發(fā)

? ? ? 串行:所有任務一個接一個的執(zhí)行,每次只有一個任務被執(zhí)行。(開啟一個線程,逐個任務執(zhí)行)

? ? ? 并發(fā):可以讓多個任務同時執(zhí)行(可以開啟多個線程同時執(zhí)行任務)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容