1、設(shè)計(jì)模式是什么咧七? 你知道哪些設(shè)計(jì)模式衰齐,并簡要敘述?
設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)继阻,就是用比較成熟的邏輯去處理某一種類型的事情耻涛。
1). 單例模式:通過static關(guān)鍵詞,聲明全局變量瘟檩。在整個(gè)進(jìn)程運(yùn)行期間只會(huì)被賦值一次抹缕。
2). 觀察者模式:KVO是典型的通知模式,觀察某個(gè)屬性的狀態(tài)墨辛,狀態(tài)發(fā)生變化時(shí)通知觀察者卓研。
3). 委托模式:代理+協(xié)議的組合。實(shí)現(xiàn)1對(duì)1的反向傳值操作背蟆。
4). 工廠模式:通過一個(gè)類方法鉴分,批量的根據(jù)已有模板生產(chǎn)對(duì)象。
什么是單例模式
簡單的來說带膀,一個(gè)單例類志珍,在整個(gè)程序中只有一個(gè)實(shí)例,并且提供一個(gè)類方法供全局調(diào)用垛叨,在編譯時(shí)初始化這個(gè)類伦糯,然后一直保存在內(nèi)存中柜某,到程序(APP)退出時(shí)由系統(tǒng)自動(dòng)釋放這部分內(nèi)存。
系統(tǒng)為我們提供的單例類有哪些敛纲?
UIApplication(應(yīng)用程序?qū)嵗?NSNotificationCenter(消息中心類)NSFileManager(文件管理類)NSUserDefaults(應(yīng)用程序設(shè)置)NSURLCache(請(qǐng)求緩存類)NSHTTPCookieStorage(應(yīng)用程序cookies池)
在哪些地方會(huì)用到單例模式
一般在我的程序中喂击,經(jīng)常調(diào)用的類,如工具類淤翔、公共跳轉(zhuǎn)類等翰绊,我都會(huì)采用單例模式
單例類的生命周期(單例實(shí)例在存儲(chǔ)器的中位置)
在程序中,一個(gè)單例類在程序中只能初始化一次旁壮,為了保證在使用中始終都是存在的监嗜,所以單例是在存儲(chǔ)器的全局區(qū)域,在編譯時(shí)分配內(nèi)存抡谐,只要程序還在運(yùn)行就會(huì)一直占用內(nèi)存裁奇,在APP結(jié)束后由系統(tǒng)釋放這部分內(nèi)存內(nèi)存。
單例模式的優(yōu)缺點(diǎn)
(1)麦撵、在整個(gè)程序中只會(huì)實(shí)例化一次刽肠,所以在程序如果出了問題,可以快速的定位問題所在免胃;
(2)音五、由于在整個(gè)程序中只存在一個(gè)對(duì)象,節(jié)省了系統(tǒng)內(nèi)存資源杜秸,提高了程序的運(yùn)行效率放仗;
(1)、不能被繼承撬碟,不能有子類诞挨;
(2)、不易被重寫或擴(kuò)展(可以使用分類)呢蛤;
(3)惶傻、同時(shí),由于單例對(duì)象只要程序在運(yùn)行中就會(huì)一直占用系統(tǒng)內(nèi)存其障,該對(duì)象在閑置時(shí)并不能銷毀银室,在閑置時(shí)也消耗了系統(tǒng)內(nèi)存資源;
代理主要由三部分組成:
協(xié)議:用來指定代理雙方可以做什么励翼,必須做什么蜈敢。
代理:根據(jù)協(xié)議,完成委托方需要實(shí)現(xiàn)的功能(方法)汽抚。
委托:根據(jù)協(xié)議抓狭,指定代理去完成什么功能。
2造烁、MVC 和 MVVM 的區(qū)別
1). MVVM是對(duì)胖模型進(jìn)行的拆分否过,其本質(zhì)是給控制器減負(fù)午笛,將一些弱業(yè)務(wù)邏輯放到VM中去處理。
2). MVC是一切設(shè)計(jì)的基礎(chǔ)苗桂,所有新的設(shè)計(jì)模式都是基于MVC進(jìn)行的改進(jìn)药磺。
1). MVC模式:Model View Control,把模型 視圖 控制器 層進(jìn)行解耦合編寫煤伟。
2). MVVM模式:Model View ViewModel 把模型 視圖 業(yè)務(wù)邏輯 層進(jìn)行解耦和編寫癌佩。
3、ViewController生命周期
1.initWithCoder:通過nib文件初始化時(shí)觸發(fā)便锨。2.awakeFromNib:nib文件被加載的時(shí)候驼卖,會(huì)發(fā)生一個(gè)awakeFromNib的消息到nib文件中的每個(gè)對(duì)象。3.loadView:開始加載視圖控制器自帶的view鸿秆。4.viewDidLoad:視圖控制器的view被加載完成。5.viewWillAppear:視圖控制器的view將要顯示在window上怎囚。6.updateViewConstraints:視圖控制器的view開始更新AutoLayout約束卿叽。7.viewWillLayoutSubviews:視圖控制器的view將要更新內(nèi)容視圖的位置。8.viewDidLayoutSubviews:視圖控制器的view已經(jīng)更新視圖的位置恳守。9.viewDidAppear:視圖控制器的view已經(jīng)展示到window上考婴。10.viewWillDisappear:視圖控制器的view將要從window上消失。11.viewDidDisappear:視圖控制器的view已經(jīng)從window上消失催烘。
4沥阱、你是否接觸過OC中的反射機(jī)制?簡單聊一下概念和使用
1).class反射 通過類名的字符串形式實(shí)例化對(duì)象伊群。 Classclass=NSClassFromString(@"student"); Student *stu = [[classalloc] init]; 將類名變?yōu)樽址? Classclass=[Studentclass];NSString*className =NSStringFromClass(class);
2). SEL的反射 通過方法的字符串形式實(shí)例化方法考杉。 SEL selector =NSSelectorFromString(@"setName"); [stu performSelector:selector withObject:@"Mike"]; 將方法變成字符串。NSStringFromSelector(@selector*(setName:));
5舰始、iOS的沙盒目錄結(jié)構(gòu)是怎樣的崇棠?
沙盒結(jié)構(gòu):
1). Application:存放程序源文件,上架前經(jīng)過數(shù)字簽名丸卷,上架后不可修改枕稀。
2). Documents:常用目錄,iCloud備份目錄谜嫉,存放數(shù)據(jù)萎坷。(這里不能存緩存文件,否則上架不被通過)
3). Library:
? ? ? ? Caches:存放體積大又不需要備份的數(shù)據(jù)沐兰。(常用的緩存路徑)
? ? ? ? Preference:設(shè)置目錄哆档,iCloud會(huì)備份設(shè)置信息。
4). tmp:存放臨時(shí)文件僧鲁,不會(huì)被備份虐呻,而且這個(gè)文件下的數(shù)據(jù)有可能隨時(shí)被清除的可能象泵。
6、什么是 RunLoop
從字面上講就是運(yùn)行循環(huán)斟叼,它內(nèi)部就是do-while循環(huán)偶惠,在這個(gè)循環(huán)內(nèi)部不斷地處理各種任務(wù)。一個(gè)線程對(duì)應(yīng)一個(gè)RunLoop朗涩,基本作用就是保持程序的持續(xù)運(yùn)行忽孽,處理app中的各種事件。通過runloop谢床,有事運(yùn)行兄一,沒事就休息,可以節(jié)省cpu資源识腿,提高程序性能出革。主線程的run loop默認(rèn)是啟動(dòng)的。iOS的應(yīng)用程序里面渡讼,程序啟動(dòng)后會(huì)有一個(gè)如下的main()函數(shù)intmain(intargc,char* argv[]) {@autoreleasepool{returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass])); }}
7骂束、HTTP協(xié)議中 POST 方法和 GET 方法有那些區(qū)別?
1. GET用于向服務(wù)器請(qǐng)求數(shù)據(jù),POST用于提交數(shù)據(jù)
2. GET請(qǐng)求成箫,請(qǐng)求參數(shù)拼接形式暴露在地址欄展箱,而POST請(qǐng)求參數(shù)則放在請(qǐng)求體里面,因此GET請(qǐng)求不適合用于驗(yàn)證密碼等操作
3. GET請(qǐng)求的URL有長度限制蹬昌,POST請(qǐng)求不會(huì)有長度限制
8混驰、談?wù)?UITableView 的優(yōu)化
1). 正確的復(fù)用cell。
2). 設(shè)計(jì)統(tǒng)一規(guī)格的Cell
3). 提前計(jì)算并緩存好高度(布局)皂贩,因?yàn)閔eightForRowAtIndexPath:是調(diào)用最頻繁的方法栖榨;
4). 異步繪制,遇到復(fù)雜界面先紫,遇到性能瓶頸時(shí)治泥,可能就是突破口;
4). 滑動(dòng)時(shí)按需加載遮精,這個(gè)在大量圖片展示居夹,網(wǎng)絡(luò)加載的時(shí)候很管用!
5). 減少子視圖的層級(jí)關(guān)系
6). 盡量使所有的視圖不透明化以及做切圓操作本冲。
7). 不要?jiǎng)討B(tài)的add 或者 remove 子控件准脂。最好在初始化時(shí)就添加完,然后通過hidden來控制是否顯示檬洞。
8). 使用調(diào)試工具分析問題狸膏。
9、Swift和OC的區(qū)別
1.不像C語言和OC語言一樣都必須有一個(gè)主函數(shù)main()作為程序的入口, swift程序從第一句開始向下順序執(zhí)行, 一直到最后
2.每個(gè)語句結(jié)束后可以不加分號(hào), 但是多條語句不能寫在同一行
3.在聲明常亮后者變量的時(shí)候直接初始化可以省略其類型,? 否則需要在變量名稱跟冒號(hào)加類型. 實(shí)際開發(fā)中建議全部都加上, 以免出現(xiàn)問題
4.swift數(shù)據(jù)類型都會(huì)自動(dòng)判斷, 只區(qū)分變量var 和 常量let
5.swift可以多對(duì)多賦值. let(x,y) = (1,2)
6.swift和OC比較具有全局性, 因?yàn)閟wift是全局的所以編譯的速度比OC慢
10添怔、iOS自定義控件開發(fā)方式
使用代碼創(chuàng)建自定義控件
1.創(chuàng)建一個(gè)繼承自UIView的類
2.實(shí)現(xiàn)initWithFrame:方法湾戳。在該方法中贤旷,設(shè)置自定義控件的屬性,并創(chuàng)建砾脑、添加子視圖:
3.如果需要對(duì)子視圖重新布局幼驶,需要調(diào)用layoutSubViews方法
4.最后,添加自定義控件到頁面上
小結(jié)
這兩種創(chuàng)建自定義控件的方式各有優(yōu)劣韧衣,純代碼方式比較靈活盅藻,維護(hù)和擴(kuò)展都比較方便,但寫起來比較麻煩畅铭。xib方式開發(fā)效率高氏淑,但不易擴(kuò)展和維護(hù),適合功能樣式比較穩(wěn)定的自定義控件硕噩。
11假残、iOS事件分發(fā)機(jī)制介紹與應(yīng)用
iOS事件分發(fā)流程1.hitTest 2.sendEvent 3.事件處理
事件響應(yīng)鏈
UIResponder類能夠響應(yīng)觸摸、手勢以及遠(yuǎn)程控制等事件炉擅。它是所有可響應(yīng)事件的基類守问,其中包括很常見的UIView、UIViewController以及UIApplication坑资。那么事件響應(yīng)鏈與UIResponder有什么關(guān)系呢?應(yīng)用內(nèi)的視圖按一定的結(jié)構(gòu)組織起來穆端,即樹狀層次結(jié)構(gòu)袱贮,一個(gè)視圖可以有多個(gè)子視圖,而子視圖只能有一個(gè)父視圖体啰。當(dāng)一個(gè)視圖被添加到父視圖上時(shí)攒巍。每一個(gè)視圖的nextResponder屬性就指向它的父視圖,這樣荒勇,整個(gè)應(yīng)用就通過nextResponder串成了一條鏈柒莉,即響應(yīng)鏈。響應(yīng)鏈?zhǔn)且粋€(gè)虛擬鏈沽翔,并不是真實(shí)存在的兢孝,它借助UIResponder的nextResponder串連起來
Hit-Test View
有了事件響應(yīng)鏈,接下來就是尋找具體響應(yīng)對(duì)象了仅偎,我們稱之為:Hit-Testing View跨蟹,尋找這個(gè)View的過程稱為Hit-Test。
什么是Hit-Test橘沥?我們可以把它理解為一個(gè)探測器窗轩,通過這個(gè)探測器,我們可以找到并判斷手指是否觸摸在某個(gè)視圖上座咆。
Hit-Test是如何工作的痢艺?Hit-Test采用遞歸方式從視圖的根節(jié)點(diǎn)開始遍歷仓洼,直到找到某個(gè)點(diǎn)擊的視圖。
首先從UIWindow發(fā)送hitTest:withEvent:消息開始堤舒,判斷該視圖是否能響應(yīng)觸摸事件色建,如果不能響應(yīng)返回nil,表示該視圖不能響應(yīng)觸摸事件植酥。然后再調(diào)用pointInside:withEvent:方法镀岛,該方法用于判斷觸摸事件點(diǎn)擊的位置是否處理該視圖范圍內(nèi),如果pointInside:withEvent:返回no友驮,那么hitTest:withEvent:也直接返回nil漂羊。
如果pointInside:withEvent: 方法返回yes,那么該視圖向所有子視圖發(fā)送hitTest:withEvent:消息卸留,所有子視圖的調(diào)用順序是從最頂層視圖一直到最底層視圖走越,即從subViews的數(shù)組的末尾向前遍歷。直到有子視圖返回非空對(duì)象或全部遍歷完畢耻瑟。若有子視圖返回非空對(duì)象旨指,則hitTest:withEvent:方法返回該對(duì)象,處理結(jié)束;若所有子視圖都返回nil喳整,則hitTest:withEvent:方法返回該視圖自身谆构。
事件傳遞機(jī)制的應(yīng)用
舉幾個(gè)例子,說明一下事件傳遞機(jī)制在自定義控件中的應(yīng)用框都。
12搬素、iOS本地?cái)?shù)據(jù)保存常用方式
NSUserDefaults
歸檔(序列化)
文件
數(shù)據(jù)庫
CoreData
KeyChain
13、談?wù)勀銓?duì)多線程開發(fā)的理解魏保?ios中有幾種實(shí)現(xiàn)多線程的方法熬尺?
好處:
1.使用多線程可以把程序中占據(jù)時(shí)間長的任務(wù)放到后臺(tái)去處理,如圖片谓罗,視頻的下載粱哼;
2.發(fā)揮多核處理器的優(yōu)勢,并發(fā)執(zhí)行讓系統(tǒng)運(yùn)行的更快檩咱,更流暢揭措,用戶體驗(yàn)更好;
缺點(diǎn):
1.大量的線程降低代碼的可讀性刻蚯;
2.更多的線程需要更多的內(nèi)存空間蜂筹;
3當(dāng)多個(gè)線程對(duì)同一個(gè)資源出現(xiàn)爭奪的時(shí)候要注意線程安全的問題。
ios有3種多線程編程的技術(shù):1.NSThread芦倒,2.NSOperationQueue艺挪,3.gcd;
NSThread.
每個(gè)NSThread對(duì)象對(duì)應(yīng)一個(gè)線程,量級(jí)較輕(真正的多線程)
NSThree是官方推薦的線程處理方式麻裳,它在處理機(jī)制上口蝠,需要開發(fā)者負(fù)責(zé)手動(dòng)管理Thread的生命周期歧胁,包括子線程與主線程之間的同步等多糠。線程共享同一應(yīng)用程序的部分內(nèi)存空間,它們擁有對(duì)數(shù)據(jù)相同的訪問權(quán)限免猾。你得協(xié)調(diào)多個(gè)線程 對(duì)同一數(shù)據(jù)的訪問疆瑰,一般做法是在訪問之前加鎖眉反,這會(huì)導(dǎo)致一定的性能開銷。在 iOS 中我們可以使用多種形式的 thread穆役。 比其他兩個(gè)輕量級(jí) 需要自己管理線程的生命周期寸五,線程同步。 線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開銷.
NSOperation/NSOperationQueue 面向?qū)ο蟮木€程技術(shù)
如果需要讓線程同時(shí)并行運(yùn)行多個(gè)耿币,可以將線程加入隊(duì)列(Queue)中梳杏,NSOperationQueue類就是一個(gè)線程隊(duì)列管理類,他提供了線程并行淹接、隊(duì)列的管理十性。可以認(rèn)為NSOperationQueue就是一個(gè)線程管理器塑悼,通過addOperations方法劲适,我們可以一次性把多個(gè)(數(shù)組形式)線程添加到隊(duì)列中。同時(shí)厢蒜,NSOperationQueue允許通過setMaxConcurrentOperationCount方法設(shè)置隊(duì)列的并行(同一時(shí)間)運(yùn)行數(shù)量
Grand Central Dispatch(GCD)是Apple開發(fā)的一個(gè)多核編程的解決方法减响。該方法在Mac OS X 10.6雪豹中首次推出,并隨后被引入到了iOS4.0中郭怪。GCD是一個(gè)替代諸如NSThread, NSOperationQueue, NSInvocationOperation等技術(shù)的很高效和強(qiáng)大的技術(shù),它看起來象就其它語言的閉包(Closure)一樣刊橘,但蘋果把它叫做blocks鄙才。
GCD —— Grand Central Dispatch(大調(diào)度中心) 是基于C語言的框架,可以充分利用多核促绵,是蘋果推薦使用的多線程技術(shù)
以上這三種編程方式從上到下攒庵,抽象度層次是從低到高的,抽象度越高的使用越簡單败晴,也是Apple最推薦使用的浓冒,在項(xiàng)目中很多框架技術(shù)分別使用了不同多線程技術(shù)。
三種多線程技術(shù)的對(duì)比
NSThread:
優(yōu)點(diǎn):NSThread 比其他兩個(gè)輕量級(jí)尖坤,使用簡單
缺點(diǎn):需要自己管理線程的生命周期稳懒、線程同步、加鎖慢味、睡眠以及喚醒等场梆。線程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開銷
NSOperation:不需要關(guān)心線程管理墅冷,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上–NSOperation是面向?qū)ο蟮?/p>
優(yōu)點(diǎn): 提供了一些在GCD中不容易實(shí)現(xiàn)的特性,如:限制最大并發(fā)數(shù)量,操作之間的依賴關(guān)系.
GCD:NSOperation的高效和強(qiáng)大的技術(shù)–GCD是基于C語言的
優(yōu)點(diǎn)1:用Block定義任務(wù),使用起來非常靈活便捷;(要注意:也可能出現(xiàn)循環(huán)引用)
優(yōu)點(diǎn)2:提供了更多的控制能力以及操作隊(duì)列中所不能使用的底層函數(shù).
14或油、iOS App上架流程
15寞忿、代理丶通知丶KVO之間是怎么在控制器之間通信的,或者說是怎么傳值的顶岸,又或者說之間的區(qū)別
1.委托 delegation腔彰;
2.通知中心? Notification Center;
3.鍵值觀察? key value observing(KVO)
16辖佣、iOS-APP瘦身
17霹抛、APP內(nèi)測方式
第三方框架
1、AFNetworking 底層原理分析
AFNetworking主要是對(duì)NSURLSession和NSURLConnection(iOS9.0廢棄)的封裝,其中主要有以下類:1). AFHTTPRequestOperationManager:內(nèi)部封裝的是NSURLConnection, 負(fù)責(zé)發(fā)送網(wǎng)絡(luò)請(qǐng)求, 使用最多的一個(gè)類凌简。(3.0廢棄)2). AFHTTPSessionManager:內(nèi)部封裝是NSURLSession, 負(fù)責(zé)發(fā)送網(wǎng)絡(luò)請(qǐng)求,使用最多的一個(gè)類上炎。3). AFNetworkReachabilityManager:實(shí)時(shí)監(jiān)測網(wǎng)絡(luò)狀態(tài)的工具類。當(dāng)前的網(wǎng)絡(luò)環(huán)境發(fā)生改變之后,這個(gè)工具類就可以檢測到雏搂。4). AFSecurityPolicy:網(wǎng)絡(luò)安全的工具類, 主要是針對(duì) HTTPS 服務(wù)藕施。5). AFURLRequestSerialization:序列化工具類,基類。上傳的數(shù)據(jù)轉(zhuǎn)換成JSON格式 (AFJSONRequestSerializer).使用不多凸郑。6). AFURLResponseSerialization:反序列化工具類;基類.使用比較多:7). AFJSONResponseSerializer; JSON解析器,默認(rèn)的解析器.8). AFHTTPResponseSerializer; 萬能解析器; JSON和XML之外的數(shù)據(jù)類型,直接返回二進(jìn)制數(shù)據(jù).對(duì)服務(wù)器返回的數(shù)據(jù)不做任何處理.9). AFXMLParserResponseSerializer; XML解析器;
2裳食、描述下SDWebImage里面給UIImageView加載圖片的邏輯
加載圖片的過程大致如下:1.首先會(huì)在 SDWebImageCache 中尋找圖片是否有對(duì)應(yīng)的緩存, 它會(huì)以u(píng)rl 作為數(shù)據(jù)的索引先在內(nèi)存中尋找是否有對(duì)應(yīng)的緩存? 2.如果緩存未找到就會(huì)利用通過MD5處理過的key來繼續(xù)在磁盤中查詢對(duì)應(yīng)的數(shù)據(jù), 如果找到了, 就會(huì)把磁盤中的數(shù)據(jù)加載到內(nèi)存中,并將圖片顯示出來? ?3.如果在內(nèi)存和磁盤緩存中都沒有找到芙沥,就會(huì)向遠(yuǎn)程服務(wù)器發(fā)送請(qǐng)求诲祸,開始下載圖片? 4.下載后的圖片會(huì)加入緩存中,并寫入磁盤中5.整個(gè)獲取圖片的過程都是在子線程中執(zhí)行而昨,獲取到圖片后回到主線程將圖片顯示出來?
?SDWebImage原理:調(diào)用類別的方法:1.從內(nèi)存(字典)中找圖片(當(dāng)這個(gè)圖片在本次使用程序的過程中已經(jīng)被加載過)救氯,找到直接使用。2.從沙盒中找(當(dāng)這個(gè)圖片在之前使用程序的過程中被加載過)歌憨,找到使用着憨,緩存到內(nèi)存中。3.從網(wǎng)絡(luò)上獲取务嫡,使用甲抖,緩存到內(nèi)存,緩存到沙盒心铃。