11.ios7阀坏、ios8和ios9的區(qū)別
解答:
ios7中,pch文件默認是創(chuàng)建好的释液,直接使用就可以
ios8中全释,pch文件需要自己創(chuàng)建(ios——other——PCHfile)并且需要設(shè)置pch文件的路徑(target ——> build setting--> 輸入prefix --> Apple LLVM7.0 -Language —> Prefix Header,后和橋接頭文件的設(shè)置一樣)
ios9中,pch文件的創(chuàng)建以及路徑設(shè)置和ios8中一樣误债,但是需要在pch文件中添加一個標(biāo)記
12.PCH的作用
作用:
就相當(dāng)于Swift中的Swift File浸船, 寫在這里的頭文件或者定義的變量可以全局訪問到
格式:#ifdef __ OBJC __ (內(nèi)容) #endif
內(nèi)容:1.全局可使用的頭文件
2.可以添加全局可用的宏定義(就相當(dāng)于Swift File中的常量)
宏定義的名稱最好大寫,格式為#define XXXX
13.常用設(shè)計模式:MVC 寝蹈、工廠李命、代理
MVC設(shè)計模式
MVC是一種架構(gòu)模式,M表示數(shù)據(jù)模型Model箫老,V表示視圖View封字,C表示控制器Controller。
1耍鬓、Model負責(zé)存儲阔籽、定義、操作數(shù)據(jù)牲蜀。
2笆制、View用來展示數(shù)據(jù)給用戶,和用戶進行操作交互涣达。
3在辆、Controller是Model于View的協(xié)調(diào)者,Controller把Model中的數(shù)據(jù)拿過來給View使用度苔。 Controller可以直接與Model和View進行通信匆篓,而View不能和Controller直接通信。View與Controller通信需要利用代理協(xié)議的方法寇窑,當(dāng)有數(shù)據(jù)的更新時鸦概,Model也要與Controller進行通信,這個時候使用notificationhe KVO甩骏,這個方式就像一個廣播完残,Model發(fā)射信號,Controller設(shè)置監(jiān)聽器接收信號横漏,當(dāng)有數(shù)據(jù)要更新時,就發(fā)信號給Controller熟掂。Model和View不能直接進行通信缎浇,因為這樣就違背了MVC的設(shè)計思想。
工廠
工廠方法模式:定義創(chuàng)建對象的接口赴肚,讓子類決定實例化哪一個類素跺。工廠方法使得一個類的實例化延遲到其子類二蓝。
使用場景:
1、編譯時無法準(zhǔn)確預(yù)期要創(chuàng)建的對象的類指厌;
2刊愚、類想讓子類決定在運行時創(chuàng)建什么;
3踩验、類有若干輔助類為其子類鸥诽,而你想將返回哪個子類這一信息局部;
代理
代理是一種概念箕憾,是用協(xié)議來實現(xiàn)的牡借。代理是兩個對象之間通訊的一種方式,代理主要做反向傳值袭异,實現(xiàn)系統(tǒng)的一些回調(diào)方法钠龙,一般用來1:1的兩個對象通訊上。
14.frame和bounds的區(qū)別
- frmae
+ 以`父控件內(nèi)容`的左上角的坐標(biāo)為原點御铃,計算出`控件自己矩形框`的位置的尺寸
- bounds
- 以
控件自己內(nèi)容
的的左上角為坐標(biāo)原點碴里,計算出控件自己矩形框
的位置的尺寸
- 概括
- frame.size == bounds.size
- scrollView.bounds.origin == scrollView.contentOffset
用圖說話:
15.幾種持久化存儲的區(qū)別:plist、NSUserDefault上真、歸檔(coder)咬腋、數(shù)據(jù)庫
plist文件
property list 屬性列表文件,文件的內(nèi)容只能是 NSString NSNumber NSDate NSData NSArray NSDictionary類的對象內(nèi)容谷羞,不能保存其他類型數(shù)據(jù)帝火。
作用: 對一些登陸注冊信息或者程序的配置信息(小數(shù)據(jù))進行持久化存儲。
歸檔
歸檔(也稱對象序列化湃缎,對象持久化存儲)就是用某種打包格式將對象保存到本地的文件犀填,以便以后讀回該對象的內(nèi)容;解檔(也稱歸檔/讀檔)就是把歸檔的對象文件嗓违,讀成原來的對象的過程九巡。
NSUserDefaults
NSUserDefaults適合存儲輕量級的本地數(shù)據(jù),比如要保存一個登陸界面的數(shù)據(jù)蹂季,用戶名冕广、密碼之類的,個人覺得使用NSUserDefaults是首選偿洁。下次再登陸的時候就可以直接從NSUserDefaults里面讀取上次登陸的信息撒汉。
數(shù)據(jù)庫
數(shù)據(jù)庫管理系統(tǒng)(Database Management System)是一種操縱和管理數(shù)據(jù)庫的大型軟件,用于建立涕滋、使用和維護數(shù)據(jù)庫睬辐,簡稱..DBMS。它對數(shù)據(jù)庫進行統(tǒng)一的管理和控制,以保證數(shù)據(jù)庫的安全性和完整性溯饵。
15.1. sqlite和CoreData的區(qū)別
a. 使用方便性侵俗。一個成熟的工程中一定是對數(shù)據(jù)持久化進行了封裝的,因此底層使用的到底是core data還是sqlite丰刊,不應(yīng)該被業(yè)務(wù)邏輯開發(fā)者關(guān)心隘谣。因此,即使習(xí)慣寫SQL查詢的人啄巧,也應(yīng)該避免在業(yè)務(wù)邏輯中直接編寫SQL語句寻歧。
b. 存儲性能,在寫入性能上棵帽,因為都是使用的sqlite格式作為磁盤存儲格式熄求,因此其性能是一樣的。
c. 查詢性能逗概,core data因為要兼容多種后端格式弟晚,因此查詢時,其可用的語句比直接使用sqlite少逾苫,因此有些fetch實際上不是在sqlite中執(zhí)行的卿城。
d. core data的一個比較大的痛點是多人合作開發(fā)的時候,管理coredata的模型需要很小心铅搓,尤其是合并的時候瑟押,它的data model是XML格式的,手動resolve比較煩心星掰。
e. core data還有其他sql所不具備的優(yōu)點多望,比如對undo的支持,多個context實現(xiàn)sketchbook類似的功能氢烘。為ManagedObject優(yōu)化的row cash等怀偷。
f. 另外core data是支持多線程的,但需要thread confinement的方式實現(xiàn),使用了多線程之后可以最大化的防止阻塞主線程播玖。
16.響應(yīng)者鏈
解答:
子控件/子視圖的響應(yīng)事件響應(yīng)順序:UIApplication --> window --> controller(控制器) --> 父控件(父視圖)--> 子控件/子視圖(第一響應(yīng)者)
注意:其一父類不響應(yīng)就會攔截
17.GCD
回答:
dispatch_get_global_queue 后臺執(zhí)行
dispatch_get_main_queue 主線程執(zhí)行
dispatch_once_t 一次性執(zhí)行
dispatch_time_t 延遲執(zhí)行
dispatch_group_async 并行執(zhí)行
dispatch_group_notify 并行執(zhí)行后匯總
18.UITableView的復(fù)用機制
復(fù)用機制:
UITableView首先加載一屏幕(假設(shè)UITableView的大小是整個屏幕的大小)所需要的UITableViewCell,具體個數(shù)要根據(jù)每個cell的高度而定椎工,總之肯定要鋪滿整個屏幕,更準(zhǔn)確說當(dāng)前加載的cell的高度要大于屏幕高度。然后你往上滑動蜀踏,想要查看更多的內(nèi)容维蒙,那么肯定需要一個新的cell放在已經(jīng)存在內(nèi)容的下邊。這時候先不去生成果覆,而是先去UITableView自己的一個資源池里去獲取颅痊。這個資源池里放了已經(jīng)生成的而且能用的cell。如果資源池是空的話才會主動生成一個新的cell局待。那么這個資源池里的cell又來自哪里呢斑响?當(dāng)你滑動時視圖是吗讶,位于最頂部的cell會相應(yīng)的往上滑動,直到它徹底消失在屏幕上恋捆,消失的cell去了哪里呢?你肯定想到了重绷,是的沸停,它被UITableView放到資源池里了。其他cell也是這樣昭卓,只要一滑出屏幕就放入資源池愤钾。這樣,有進有出候醒,總共需要大約一屏幕多一兩個的cell就夠了能颁。相對于1000來說節(jié)省的資源就是指數(shù)級啊,完美解決了性能問題
注意:
設(shè)置 Cell 的存在差異性的那些屬性(包括樣式和內(nèi)容)時倒淫,有了 if 最好就要有 else伙菊,要顯式的覆蓋所有可能性。
設(shè)置 Cell 的存在差異性的那些屬性時敌土,代碼要放在初始化代碼塊的外部
優(yōu)化:
- 通過正確的設(shè)置 reuseIdentifier 來重用 Cell镜硕。
- 盡量減少不必要的透明 View。
- 盡量避免漸變效果返干、圖片拉伸和離屏渲染兴枯。
- 當(dāng)不同的行的高度不一樣時,盡量緩存它們的高度值矩欠。
- 如果Cell 展示的內(nèi)容來自網(wǎng)絡(luò)财剖,確保用異步加載的方式來獲取數(shù)據(jù),并且緩存服務(wù)器的 response癌淮。
使用 shadowPath 來設(shè)置陰影效果躺坟。 - 盡量減少 subview 的數(shù)量,對于 subview 較多并且樣式多變的 Cell该默,可以考慮用異步繪制或重寫drawRect瞳氓。
- 盡量優(yōu)化 - [UITableView tableView:cellForRowAtIndexPath:]
方法中的處理邏輯,如果確實要做一些處理栓袖,可以考慮做一次匣摘,緩存結(jié)果。 - 選擇合適的數(shù)據(jù)結(jié)構(gòu)來承載數(shù)據(jù)裹刮,不同的數(shù)據(jù)結(jié)構(gòu)對不同操作的開銷是存在差異的音榜。
對于 rowHeight、sectionFooterHeight捧弃、sectionHeaderHeight 盡量使用常量赠叼。
19.UITableView的優(yōu)化
- 復(fù)用問題
- 盡量避免使用動畫
- 在圖片數(shù)量多的情況下擦囊,使用異步加載,并做緩存
- 自定義cell的時候直接繪制drawRect(幾乎沒人用)
20.內(nèi)存管理
swift中使用的是ARC(自動管理)內(nèi)存管理技術(shù)
oc中使用的是MRC(手動管理)和ARC(自動管理)的內(nèi)存管理技術(shù)
ARC是IOS5推出的新功能嘴办,通過ARC瞬场,可以自動的管理內(nèi)存。在ARC模式下涧郊,只要沒有強指針(強引用)指向?qū)ο蠊岜唬瑢ο缶蜁会尫拧T贏RC模式下妆艘,不允許使用retain彤灶、release、retainCount等方法批旺。并且幌陕,如果使用dealloc方法時,不允許調(diào)用[super dealloc]方法汽煮。
ARC模式下的property變量修飾詞為strong搏熄、weak,相當(dāng)于MRC模式下的retain逗物、assign搬卒。strong :代替retain,缺省關(guān)鍵詞翎卓,代表強引用契邀。weak:代替assign,聲明了一個可以自動設(shè)置nil的弱引用失暴,但是比assign多一個功能坯门,指針指向的地址被釋放之后,指針本身也會自動被釋放逗扒。
注意
在ARC的項目中古戴,對MRC的文件可以添加編譯選項-fno-objc-arc的標(biāo)識;
在MRC的項目中對ARC的文件可以添加編譯選項 -fobjc-arc的標(biāo)識矩肩。
21.代理和通知的區(qū)別
代理:1個對象只能告訴另1個對象發(fā)生了什么事
通知:1個對象可以告訴N個對象發(fā)生了什么事