ios開發(fā)紀(jì)要

一、ios沙盒機(jī)制


屏幕快照 2018-07-12 上午11.38.29.png

應(yīng)用間數(shù)據(jù)不能共享,不能訪問其他沙盒內(nèi)的數(shù)據(jù),不能把數(shù)據(jù)寫入到其他沙盒中,安全,app間訪問使用url scheme機(jī)制。

Documents:用來存放app運(yùn)行生成的需要持久化的數(shù)據(jù),也存放用戶生成的數(shù)據(jù)。iTunes和設(shè)備同步時(shí),該數(shù)據(jù)會被同步。

Library/caches,網(wǎng)絡(luò)下載的數(shù)據(jù)(文件,圖片,音視頻等)存放在此,iTunes和設(shè)備同步時(shí)該數(shù)據(jù)不會同步。

Library/preferences,存放用戶偏好數(shù)據(jù),以NSUserDefault這個(gè)類來訪問,不能自己創(chuàng)建,iTunes和設(shè)備同步時(shí),該數(shù)據(jù)會被同步。

tmp,臨時(shí)存放的不重要的數(shù)據(jù),app不運(yùn)行時(shí)會被系統(tǒng)清理,iTunes和設(shè)備同步時(shí),該數(shù)據(jù)不會被同步。

沙盒中各文件存儲不能隨意,否則會被App Store拒絕上傳。比如把網(wǎng)絡(luò)下載的數(shù)據(jù)存放在Documents中。

二、ios中的多線程
在ios多線程開發(fā)中,可以通過NSOperation和GCD來進(jìn)行,GCD是一套C語言API,NSOperation是基于GCD封裝的OC庫。主隊(duì)列是串行隊(duì)列,擁有主線程,關(guān)于UI的渲染和刷新只能在主線程中完成。主線程是個(gè)常駐線程,因?yàn)槟J(rèn)開啟了mainrunloop,其他子線程則不是常駐線程,因?yàn)槟J(rèn)沒有開啟runloop,線程和runloop是一一對應(yīng)的關(guān)系,非常駐線程在執(zhí)行完任務(wù)后會被銷毀。

非主隊(duì)列的串行隊(duì)列只能開啟一個(gè)子線程,并發(fā)隊(duì)列可以開啟多個(gè)子線程。串行隊(duì)列執(zhí)行任務(wù)是串行執(zhí)行的,并發(fā)隊(duì)列執(zhí)行任務(wù)可以并發(fā)執(zhí)行。同步任務(wù)都是在主線程中執(zhí)行,異步任務(wù)會被放在子線程中去執(zhí)行。同步任務(wù)的優(yōu)先級高于異步任務(wù),所以當(dāng)隊(duì)列中有同步任務(wù)時(shí),只有等同步任務(wù)執(zhí)行完成之后才會執(zhí)行該隊(duì)列后面的任務(wù)。所以在主線程中執(zhí)行同步任務(wù)會造成死鎖,因?yàn)榇嘘?duì)列是串行執(zhí)行,同步任務(wù)提交到隊(duì)列中是排隊(duì)在隊(duì)列尾部,但是同步任務(wù)又必須要執(zhí)行完才能往后執(zhí)行其它任務(wù),這就造成了死循環(huán)。

ios中主線程的堆??臻g是1M,其它子線程都是512KB。

ios中App切換到后臺之后,大概有5s左右的時(shí)間處理,之后所有線程將會被掛起,直到app重新切換到前臺。當(dāng)然官方API提供了一個(gè)方法可以向系統(tǒng)借用更多的時(shí)間(10 min左右)。線程被掛起后并不會被系統(tǒng)清理,只有當(dāng)系統(tǒng)內(nèi)存緊張時(shí),處于后臺不活躍的進(jìn)程才會被系統(tǒng)清理,系統(tǒng)是盡量維持足夠多的后臺進(jìn)程在內(nèi)存中。

三、ios動態(tài)庫
framework是Cocoa/Cocoa Touch程序中使用的一種資源打包方式,可以將將代碼文件、頭文件、資源文件、說明文檔等集中在一起,方便開發(fā)者使用,作為一名Cocoa/Cocoa Touch程序員每天都要跟各種各樣的Framework打交道。Cocoa/Cocoa Touch開發(fā)框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等。需要注意的是,這些framework無一例外都是動態(tài)庫。

但殘忍的是,Cocoa Touch上并不允許我們使用自己創(chuàng)建的framework。不過由于framework是一種優(yōu)秀的資源打包方式,擁有無窮智慧的程序員們便想出了以framework的形式打包靜態(tài)庫的招數(shù),因此我們平時(shí)看到的第三方發(fā)布的framework無一例外都是靜態(tài)庫,真正的動態(tài)庫是上不了AppStore的。

iOS8開始,apple放開了動態(tài)庫的使用,用戶可以通過xcode創(chuàng)建動態(tài)庫的framework,并且集成到app中,提交到appstore已經(jīng)不會被拒絕。

動態(tài)庫能做什么?
和靜態(tài)庫在編譯時(shí)和app代碼鏈接并打進(jìn)同一個(gè)二進(jìn)制包中不同,動態(tài)庫可以在運(yùn)行時(shí)手動加載,這樣就可以做很多事情,比如:

應(yīng)用插件化
目前很多應(yīng)用功能越做越多,軟件顯得越來越臃腫。因此插件化就成了很多軟件發(fā)展的必經(jīng)之路,比如支付寶這種平臺級別的軟件。

首頁上密密麻麻的功能,而且還在增多,照這個(gè)趨勢發(fā)展下去,軟件包的大小將會不可想象。目前常用的解決方案是使用web頁面,但用戶體驗(yàn)和Native界面是沒法比的。

設(shè)想,如果每一個(gè)功能點(diǎn)都是一個(gè)動態(tài)庫,在用戶想使用某個(gè)功能的時(shí)候讓其從網(wǎng)絡(luò)下載,然后手動加載動態(tài)庫,實(shí)現(xiàn)功能的的插件化,就再也不用擔(dān)心功能點(diǎn)的無限增多了。

軟件版本實(shí)時(shí)模塊升級
還在忍受蘋果動輒一周,甚至更長的審核周期嗎?有了動態(tài)庫媽媽就再也不用擔(dān)心你的軟件升級了!

如果軟件中的某個(gè)功能點(diǎn)出現(xiàn)了嚴(yán)重的bug,或者想在其中新增功能,你的這個(gè)功能點(diǎn)又是通過動態(tài)庫實(shí)現(xiàn)的,這時(shí)候你只需要在適當(dāng)?shù)臅r(shí)候從服務(wù)器上將新版本的動態(tài)庫文件下載到本地,然后在用戶重啟應(yīng)用的時(shí)候即可實(shí)現(xiàn)新功能的展現(xiàn)。

共享可執(zhí)行文件
在其它大部分平臺上,動態(tài)庫都可以用于不同應(yīng)用間共享,這就大大節(jié)省了內(nèi)存。從目前來看,iOS仍然不允許進(jìn)程間共享動態(tài)庫,即iOS上的動態(tài)庫只能是私有的,因?yàn)槲覀內(nèi)匀徊荒軐討B(tài)庫文件放置在除了自身沙盒以外的其它任何地方。

不過iOS8上開放了App Extension功能,可以為一個(gè)應(yīng)用創(chuàng)建插件,這樣主app和插件之間共享動態(tài)庫還是可行的。

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

友情鏈接更多精彩內(nèi)容