一、代碼重構(gòu)基本思想
1.工作分塊細(xì)化?
2.小功能注意封裝竞思,大功能注意模塊化
3.項目文件結(jié)構(gòu)分層要明晰
4.命名可讀化
3.iCloud同步特性
?
概念:iCloud是蘋果提供的云端服務(wù)娘荡,用戶可以將通訊錄、備忘錄魁袜、郵件桩撮、照片、音樂慌核、視頻等備份到云服務(wù)器并在各個蘋果設(shè)備間直接進(jìn)行共享而無需關(guān)心數(shù)據(jù)同步問題距境,甚至即使你的設(shè)備丟失后在一臺新的設(shè)備上也可以通過Apple ID登錄同步。
蘋果已經(jīng)將云端存儲功能開放給開發(fā)者垮卓,可以存儲兩類數(shù)據(jù):
1.key-value data: 分享小量的非關(guān)鍵配置數(shù)據(jù)到應(yīng)用的多個實例垫桂,使用類似于NSUserDefault.
2.document:?存儲用戶文檔和應(yīng)用數(shù)據(jù)到用戶的iCloud賬戶
Cloud Kit :更像是一個數(shù)據(jù)庫,蘋果會提供一個dashboard作為云存儲的管理端。
Cloud Kit 基礎(chǔ)cloud kit一共有7個基礎(chǔ)類?
1.CKContainer:類似于應(yīng)用運行時的沙盒粟按,一個應(yīng)用只能訪問自己的沙盒诬滩,同樣的,一個應(yīng)用也只能訪問自己的Container灭将。
2.CKDatabase:很明顯就是數(shù)據(jù)庫疼鸟,他擁有私有數(shù)據(jù)庫和公有數(shù)據(jù)庫兩種類型。用戶只能訪問自己的私有數(shù)據(jù)庫庙曙,一些不敏感的數(shù)據(jù)也可以存儲在公有數(shù)據(jù)庫中空镜。
3.CKRecord:就是數(shù)據(jù)庫中的一條數(shù)據(jù)記錄,他通過key-value的方式來存儲和獲取數(shù)據(jù)。
4.CKRecordZone:是用來保存Record的吴攒。所有的Record都是保存在這里张抄,應(yīng)用有一個默認(rèn)的zone,也可以自定義zone洼怔。
5.CKRecordIdentifier:是Record的唯一標(biāo)示署惯,用來確定Record在數(shù)據(jù)庫中的位置。
6.CKReference:是一種引用關(guān)系镣隶。
7.CKAsset:?為資源文件极谊,比如之前提到的照片就是用這種方式存儲的。
4.OC是動態(tài)語言安岂,主要體現(xiàn)在哪里轻猖?
OC常見的動態(tài)特性分為:動態(tài)類型(Dynamic typing),動態(tài)綁定(Dynamic binding),動態(tài)加載(Dynamic loading)
所謂運行時特性即只有在運行時才會進(jìn)行具體準(zhǔn)確識別的特性
動態(tài)類型:運行(時)后再決定對象的真正類型.
動態(tài)綁定:即在實例對象所真正歸屬類確定之后,將該類下某些屬性和相應(yīng)的方法綁定到真正的類的實例對象上域那。屬性和方法既包括類中實現(xiàn)的實現(xiàn)方法也包括非類中實現(xiàn)方法
動態(tài)綁定基于動態(tài)類型的,在某個實例對象被確定后,其類型便被確定了蜕依。其確定類型下對應(yīng)的屬性和響應(yīng)的消息(消息的響應(yīng))也完全確定。傳統(tǒng)函數(shù)一般在編譯時就已經(jīng)把參數(shù)信息和函數(shù)的實現(xiàn)打包到編譯后的源碼二進(jìn)制文件中,OC中并沒有將方法名與方法參數(shù)信息編譯進(jìn)入二進(jìn)制文件中,運行時oc中使用消息機制調(diào)用實例方法即向該實例指針發(fā)送消息琉雳,實例指針在收到消息后,從自身的實現(xiàn)文件中尋找響應(yīng)消息的方法友瘤。
動態(tài)加載:根據(jù)對資源的實際需求進(jìn)而加載相應(yīng)的資源 ,可實現(xiàn)內(nèi)存的優(yōu)化.(不同機型適配加載@2x圖片翠肘,@1x原圖)
5.OC的消息轉(zhuǎn)發(fā)機制是什么樣的?
本質(zhì)使用runtime進(jìn)行的方法替換辫秧,代碼編譯完之后束倍,都會轉(zhuǎn)化成C語言的代碼在運行時系統(tǒng)上運行;
方法的調(diào)用主要是通過objc_msgSend(...)方法簇完成的盟戏;objc_msgSend接收一個消息并調(diào)用的過程:消息的接收者如果本身類結(jié)構(gòu)中存在這個方法绪妹,就會直接被調(diào)用,不存在就在父類中尋找柿究,直到最終成功調(diào)用或者拋出unrecognized selector邮旷;
?
第二輪面試
1.Runloop是什么概念,有什么作用蝇摸?
Runloop:運行循環(huán)婶肩,即死循環(huán)。在應(yīng)用需要的時候跑起來運行貌夕,在用戶沒有操作的時候停下來休息律歼,充分節(jié)省CPU資源,提高程序性能啡专。
一般來說险毁,一個線程一次只能執(zhí)行一個任務(wù),執(zhí)行完成后線程就回退出,但是有時候我們需要線程能夠一直“待命”隨時處理事件而不退出畔况,這就需要一個機制來完成這樣的任務(wù)鲸鹦。
Runloop作用:
1.保持程序持續(xù)運行:例如程序一啟動就會開一個主線程,主線程一開起來就會跑一個主線程對應(yīng)的RunLoop,RunLoop保證主線程不會被銷毀问窃,也就保證了程序的持續(xù)運行亥鬓;
2.處理App中的各種事件(比如:觸摸事件,定時器事件域庇,Selector事件等 )嵌戈;
3.節(jié)省CPU資源,優(yōu)化程序性能:程序運行起來時,當(dāng)什么操作都沒有做的時候听皿,RunLoop就通知系統(tǒng)熟呛,現(xiàn)在沒有事情做,然后進(jìn)行休息待命狀態(tài)尉姨,這時系統(tǒng)就會將其資源釋放出來去做其他的事情庵朝。當(dāng)有事情做,也就是一有響應(yīng)的時候RunLoop就會立馬起來去做事情又厉;
RunLoop九府,最重要的作用,也就是用來管理線程的覆致≈堆可以說,沒有線程煌妈,也就沒有RunLoop的存在必要儡羔。當(dāng)線程的RunLoop一開啟,RunLoop便開始對線程進(jìn)行管理工作:在線程執(zhí)行完任務(wù)后璧诵,線程便會進(jìn)入休眠狀態(tài)汰蜘,并且不會退出,隨時等待新的任務(wù)之宿。
一個 RunLoop 包含若干個 Mode族操,每個 Mode 又包含若干個 Source/Timer/Observer。
每次調(diào)用 RunLoop 的主函數(shù)時澈缺,只能指定其中一個 Mode坪创,這個Mode被稱作 CurrentMode。如果需要切換 Mode姐赡,只能退出 Loop莱预,再重新指定一個 Mode 進(jìn)入。這樣做主要是為了分隔開不同組的 Source/Timer/Observer项滑,讓其互不影響依沮。
6.網(wǎng)絡(luò)請求用的是什么協(xié)議,網(wǎng)絡(luò)開源庫用的是哪個,內(nèi)部的原理危喉。
網(wǎng)絡(luò)請求用過HTTP/HTTPS和Socket協(xié)議
AFNetworking:并沒有為每一個請求創(chuàng)建一個線程宋渔,而是將每個請求封裝成一個NSOperation放到一個queue.每當(dāng)該operation執(zhí)行時,它都會在一個單獨的線程中創(chuàng)建NSURLConnection對象辜限,并監(jiān)聽所有的回調(diào)皇拣。由于網(wǎng)絡(luò)請求都是采用NSURLConnection或者NSURLSession的異步API,因此一個單一的處理線程已經(jīng)可以滿足需要薄嫡。
總之:AFNetworking其實是采用了NSOperationQueue+NSURLFoundation的異步API來完成高效的網(wǎng)絡(luò)請求氧急。
7.如何設(shè)置和獲取請求的cookies?
?ios的cookies存取
?8.平時開發(fā)中數(shù)據(jù)庫用的是哪個,如何實現(xiàn)讀寫隔離的毫深?
現(xiàn)在移動端的數(shù)據(jù)庫主要分兩個吩坝,SQLite和Realm,平時用的是SQLite哑蔫;說了一下SQLite通過GCD的一些API如何去實現(xiàn)讀寫隔離钉寝,主要是通過dispatch_barrier_async等隔離操作的API去實現(xiàn);
9.如何保證線程安全
10.如何進(jìn)行線程間通信
在1個進(jìn)程中闸迷,線程往往不是孤立存在的嵌纲,多個線程之間需要經(jīng)常進(jìn)行通信
線程間通信的體現(xiàn)
一:1個線程傳遞數(shù)據(jù)給另1個線程
二:在1個線程中執(zhí)行完特定任務(wù)后,轉(zhuǎn)到另1個線程繼續(xù)執(zhí)行任務(wù)
例1:
回到主線程執(zhí)行腥沽,執(zhí)行self的showImage方法疹瘦,參數(shù)是image
[self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];
回到xx線程執(zhí)行aSelector方法,參數(shù)是arg?
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;