三.數(shù)據(jù)存儲(chǔ)
1.數(shù)據(jù)存儲(chǔ)技術(shù)
1>?數(shù)據(jù)存儲(chǔ)的幾種方式?
XML屬性列表(plist)歸檔
Preference(偏好設(shè)置)
NSKeyedArchiver歸檔(NSCoding)
SQLite3
Core Data
2>?各自特點(diǎn)
Plist:
屬性列表是一種XML格式的文件,拓展名為plist
如果對(duì)象是NSString、NSDictionary、NSArray、NSData、NSNumber等類(lèi)型,就可以使用writeToFile:atomically:方法直接將對(duì)象寫(xiě)到屬性列表文件中
?將一個(gè)NSDictionary對(duì)象歸檔到一個(gè)plist屬性列表中
//?將數(shù)據(jù)封裝成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"母雞" forKey:@"name"];
//?將字典持久化到Documents/stu.plist文件中
[dict writeToFile:path atomically:YES];
面試考點(diǎn):
1.??plist的根節(jié)點(diǎn)只能是NSDictionary和NSArray,所以存儲(chǔ)內(nèi)容必須轉(zhuǎn)為對(duì)象類(lèi)型
2.??使用場(chǎng)景?功能動(dòng)態(tài)更新應(yīng)用級(jí)別數(shù)據(jù)更新?XML的替代品
偏好設(shè)置:
每個(gè)應(yīng)用都有個(gè)NSUserDefaults實(shí)例,通過(guò)它來(lái)存取偏好設(shè)置
比如,保存用戶(hù)名、字體大小、是否自動(dòng)登錄
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"itcast" forKey:@"username"];
[defaults setFloat:18.0f forKey:@"text_size"];
[defaults setBool:YES forKey:@"auto_login"];
面試考點(diǎn):
1.??使用場(chǎng)景保存應(yīng)用信息
2.??特點(diǎn)?不會(huì)自動(dòng)刪除,itune同步,不適合存大數(shù)據(jù)
3.??使用單例模式、
4.??直接存取結(jié)構(gòu)體,基本數(shù)據(jù)類(lèi)型,無(wú)需轉(zhuǎn)換
5.??即時(shí)操作注意同步
歸檔:
如果對(duì)象是NSString、NSDictionary、NSArray、NSData、NSNumber等類(lèi)型,可以直接用NSKeyedArchiver進(jìn)行歸檔和恢復(fù)
不是所有的對(duì)象都可以直接用這種方法進(jìn)行歸檔,只有遵守了NSCoding協(xié)議的對(duì)象才可以
NSCoding協(xié)議有2個(gè)方法:
encodeWithCoder:
每次歸檔對(duì)象時(shí),都會(huì)調(diào)用這個(gè)方法。一般在這個(gè)方法里面指定如何歸檔對(duì)象中的每個(gè)實(shí)例變量,可以使用encodeObject:forKey:方法歸檔實(shí)例變量
initWithCoder:
每次從文件中恢復(fù)(解碼)對(duì)象時(shí),都會(huì)調(diào)用這個(gè)方法。一般在這個(gè)方法里面指定如何解碼文件中的數(shù)據(jù)為對(duì)象的實(shí)例變量,可以使用decodeObject:forKey方法解碼實(shí)例變量
歸檔一個(gè)NSArray對(duì)象到Documents/array.archive
NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
[NSKeyedArchiver archiveRootObject:array toFile:path];
?使用archiveRootObject:toFile:方法可以將一個(gè)對(duì)象直接寫(xiě)入到一個(gè)文件中,但有時(shí)候可能想將多個(gè)對(duì)象寫(xiě)入到同一個(gè)文件中,那么就要使用NSData來(lái)進(jìn)行歸檔對(duì)象
??歸檔(編碼)
//?新建一塊可變數(shù)據(jù)區(qū)
NSMutableData *data = [NSMutableData data];
//?將數(shù)據(jù)區(qū)連接到一個(gè)NSKeyedArchiver對(duì)象
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
//?開(kāi)始存檔對(duì)象,存檔的數(shù)據(jù)都會(huì)存儲(chǔ)到NSMutableData中
[archiver encodeObject:person1 forKey:@"person1"];
[archiver encodeObject:person2 forKey:@"person2"];
//?存檔完畢(一定要調(diào)用這個(gè)方法)
[archiver finishEncoding];
//?將存檔的數(shù)據(jù)寫(xiě)入文件
[data writeToFile:path atomically:YES];
????恢復(fù)(解碼)
//?從文件中讀取數(shù)據(jù)
NSData *data = [NSData dataWithContentsOfFile:path];
//?根據(jù)數(shù)據(jù),解析成一個(gè)NSKeyedUnarchiver對(duì)象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
//?恢復(fù)完畢
[unarchiver finishDecoding];
利用歸檔實(shí)現(xiàn)深復(fù)制
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];
//?解析data,生成一個(gè)新的Person對(duì)象
Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
?面試考點(diǎn):
1.??特點(diǎn):存入Document,itune同步,不會(huì)自動(dòng)刪除,可存放大型用戶(hù)數(shù)據(jù)
2.??使用場(chǎng)景:用戶(hù)產(chǎn)生的數(shù)據(jù),如游戲,操作記錄等等
3.??可保存自定義對(duì)象,需要遵守NSCoding協(xié)議,實(shí)現(xiàn)對(duì)應(yīng)的encodeWithCoder?initWithCoder?方法
4.??和NSData的配合
4.1>?多對(duì)象單目錄存儲(chǔ)
4.2>?字典/數(shù)組內(nèi)容的深拷貝
5.??不能直接存基本類(lèi)型和結(jié)構(gòu)體,需要轉(zhuǎn)成對(duì)象?NSValue NSNumber
2>?沙盒目錄結(jié)構(gòu)
2.1> Library Caches Preferences
2.2> Documents
2.3> tmp
3>?如何讀取沙盒中plist的內(nèi)容
1>?3.1>?讀取沙盒并拼接plist的文件路徑?
??????NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];
?3.2>?根據(jù)plist根節(jié)點(diǎn)類(lèi)型讀取plist文件
NSArray *apps = [NSArray arrayWithContentsOfFile:path];
2.數(shù)據(jù)庫(kù)技術(shù)(SQLite&CoreData)
1> SQLite和CoreData的區(qū)別
1.1> CoreData可以在一個(gè)對(duì)象更新時(shí),其關(guān)聯(lián)的對(duì)象也會(huì)隨著更新,相當(dāng)于你更新一張表時(shí),其關(guān)聯(lián)的其他表的也回隨著更新
1.2> CoreData提供更簡(jiǎn)單的性能管理機(jī)制,可以限制查詢(xún)記錄的總數(shù),這個(gè)類(lèi)會(huì)自動(dòng)更新其緩存
1.3>?多表查詢(xún)方面,CoreData沒(méi)有SQL直觀,沒(méi)有類(lèi)似外連接,左連接等操作.
iOS App升級(jí)安裝 - CoreData數(shù)據(jù)庫(kù)升級(jí)
1.選中你的mydata.xcdatamodeld文件,選擇菜單editor->Add Model Version?比如取名:mydata2.xcdatamodel
2.設(shè)置當(dāng)前版本
3..修改新數(shù)據(jù)模型mydata2,在新的文件上添加字段及表
4.刪除原來(lái)的類(lèi)文件,重新生成下類(lèi)。在appdelegate中添加*optionsDictionary,原來(lái)options:nil?改成options:optionsDictionary
5.重新編譯下程序。
增加模型版本——->選擇最新的版本——->選擇表,添加字段——>刪除之前的類(lèi),重新生成。
2> iOS內(nèi)存區(qū)域
2.1>棧區(qū)
由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等.其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧.
2.2>堆區(qū)
一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)由系統(tǒng)回收
2.3>全局區(qū)(靜態(tài)區(qū))
全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量相鄰的另一塊區(qū)域.
全局區(qū)分為未初始化全局區(qū): .bss段和初始化全局區(qū): data段.
2.4>常量區(qū)
常量字符串就是放在常量區(qū)
2.5>代碼區(qū)
存放函數(shù)體的二進(jìn)制代碼
3.?你是如何優(yōu)化內(nèi)存管理
1>使用ARC
2>延遲加載?懶加載?
3>重用?在正確的地方使用reuseIndentifier?
4>緩存?NSCache?保存計(jì)算數(shù)據(jù)
5>處理內(nèi)存警告?移除對(duì)緩存,圖片object?和其他一些可以重創(chuàng)建的objects?的強(qiáng)引用
?5.1> app delegate?中使用`applicationDidReceiveMemoryWarning:`?的方法
?5.2>?自定義UIViewController?的子類(lèi)(subclass)?中覆蓋`didReceiveMemoryWarning`
?5.3>?在自定義類(lèi)中注冊(cè)并接收UIApplicationDidReceiveMemoryWarningNotification?的通知
6>重用大開(kāi)銷(xiāo)對(duì)象?NSDateFormatter?和NSCalendar?懶加載/單例?_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy”;?設(shè)置和創(chuàng)建速度一樣慢
7>自動(dòng)釋放池?手動(dòng)添加自動(dòng)釋放池
8>是否緩存圖片imageNamed?imageWithContentOfFile
9>混編
10>循環(huán)引用?delegate block nstimer
11>?移除kvo?nsnotificationcenter?并未強(qiáng)引用,只記錄內(nèi)存地址,野指針報(bào)錯(cuò)?UIViewController自動(dòng)移除?一般在dealloc中
13> performselector?延遲操作??[NSObject cancelPreviousPerformRequestsWithTarget:self]
4.?循環(huán)引用
delegate屬性的內(nèi)存策略
block循環(huán)引用?實(shí)際場(chǎng)景
5. autorelease的使用
1>工廠方法為什么不釋放對(duì)象
很多類(lèi)方法為了在代碼塊結(jié)束時(shí)引用的對(duì)象不會(huì)因無(wú)強(qiáng)引用而被釋放內(nèi)存采用自動(dòng)釋放的方式,當(dāng)其最近的自動(dòng)釋放池釋放時(shí)該對(duì)象才會(huì)釋放.
2> ARC下autorelease的使用場(chǎng)景
ARC中手動(dòng)添加autoreleasepool可用于提前釋放使用自動(dòng)釋放策略的對(duì)象,防止大量自動(dòng)釋放的對(duì)象堆積造成內(nèi)存峰值過(guò)高.
3>自動(dòng)釋放池如何工作
自動(dòng)釋放池時(shí)棧結(jié)構(gòu),每個(gè)線程的runloop運(yùn)行時(shí)都會(huì)自動(dòng)創(chuàng)建自動(dòng)釋放池,程序員可以代碼手動(dòng)創(chuàng)建自動(dòng)釋放池,自動(dòng)釋放的對(duì)象會(huì)被添加到最近的(棧頂)自動(dòng)釋放池中,系統(tǒng)自動(dòng)創(chuàng)建的自動(dòng)釋放池在每個(gè)運(yùn)行循環(huán)結(jié)束時(shí)銷(xiāo)毀釋放池并給池中所有對(duì)象發(fā)release消息,手動(dòng)創(chuàng)建釋放池在所在代碼塊結(jié)束時(shí)銷(xiāo)毀釋放池并發(fā)消息統(tǒng)一release
避免內(nèi)存峰值
SDWebimage中加載gif圖片?大循環(huán)
棧結(jié)構(gòu)棧頂
統(tǒng)一發(fā)release消息
5>ARC的實(shí)現(xiàn)原理
在程序預(yù)編譯階段,將ARC?的代碼轉(zhuǎn)換為非ARC?的代碼,自動(dòng)加入release、autorelease、retain
6.Runloop
1>?每個(gè)線程上都有一個(gè)runloop,主線程默認(rèn)開(kāi)啟,輔助線程需要手動(dòng)開(kāi)啟,主要用于
??使用端口或自定義輸入源來(lái)和其他線程通信
??使用線程的定時(shí)器
??Cocoa中使用任何performSelector…的方法
??使線程周期性工作
2> runloop的工作流程
7?Core Graphics繪圖的步驟:
獲取上下文(畫(huà)布)
創(chuàng)建路徑(自定義或者調(diào)用系統(tǒng)的API)并添加到上下文中。
進(jìn)行繪圖內(nèi)容的設(shè)置(畫(huà)筆顏色、粗細(xì)、填充區(qū)域顏色、陰影、連接點(diǎn)形狀等)
開(kāi)始繪圖(CGContextDrawPath)
釋放路徑(CGPathRelease)?
(1)核心圖形Core Graphics是用來(lái)實(shí)現(xiàn)用戶(hù)界面視覺(jué)設(shè)計(jì)方案的重要技術(shù)框架
(2)核心動(dòng)畫(huà)Core Animation提供了一套用于創(chuàng)建和渲染動(dòng)態(tài)交互效果的簡(jiǎn)單易行的解決方案,通過(guò)與UIKit的緊密配合,核心動(dòng)畫(huà)可以將界面交互對(duì)象與動(dòng)畫(huà)過(guò)渡效果進(jìn)行完美地整合。
(3)UIkit是用來(lái)打造iOS應(yīng)用的最重要的圖形技術(shù)框架,它提供了用于構(gòu)造觸屏設(shè)備用戶(hù)界面的全部工具和資源,并在整個(gè)交互體驗(yàn)的塑造過(guò)程中扮演著至關(guān)重要的角色
8點(diǎn)講動(dòng)畫(huà)和layer ,view的區(qū)別
1)觸摸
2)layer?特有
3)不觸摸的替代
4)屬性
5)為什么不合二為1
6)高級(jí)用法
1.圖層與視圖
一個(gè)視圖就是在屏幕上顯示的一個(gè)矩形塊(比如圖片,文字或者視頻),它能夠1)攔截類(lèi)似于鼠標(biāo)點(diǎn)擊或者觸摸手勢(shì)等用戶(hù)輸入。視圖在層級(jí)關(guān)系中可以互相嵌套,一個(gè)視圖可以管理它的所有子視圖的位置。
所有的視圖都從一個(gè)叫做UIVIew的基類(lèi)派生而來(lái),UIView可以處理觸摸?2)(layer不行,但是layer有錨點(diǎn)和position的概念選裝變換的時(shí)候用),可以支持基于Core Graphics繪圖,可以做仿射變換(例如旋轉(zhuǎn)或者縮放),或者簡(jiǎn)單的類(lèi)似于滑動(dòng)或者漸變的動(dòng)畫(huà)。
CALayer類(lèi)在概念上和UIView類(lèi)似,同樣也是一些被層級(jí)關(guān)系樹(shù)管理的矩形塊,同樣也可以包含一些內(nèi)容(像圖片,文本或者背景色),管理子圖層的位置。它們有一些方法和屬性用來(lái)做動(dòng)畫(huà)和變換。和UIView最大的不同是CALayer不處理用戶(hù)的交互。
CALayer并不清楚具體的響應(yīng)鏈(iOS通過(guò)視圖層級(jí)關(guān)系用來(lái)傳送觸摸事件的機(jī)制),于是它并不能夠響應(yīng)事件,即使3)它提供了一些方法來(lái)判斷是否一個(gè)觸點(diǎn)在圖層的范圍之內(nèi)。
2.平行的層級(jí)關(guān)系
?4)每一個(gè)UIview都有一個(gè)CALayer實(shí)例的圖層屬性,也就是所謂的backing layer,視圖的職責(zé)就是創(chuàng)建并管理這個(gè)圖層,以確保當(dāng)子視圖在層級(jí)關(guān)系中添加或者被移除的時(shí)候,他們關(guān)聯(lián)的圖層也同樣對(duì)應(yīng)在層級(jí)關(guān)系樹(shù)當(dāng)中有相同的操作。
實(shí)際上這些背后關(guān)聯(lián)的圖層才是真正用來(lái)在屏幕上顯示和做動(dòng)畫(huà),UIView僅僅是對(duì)它的一個(gè)封裝,提供了一些iOS類(lèi)似于處理觸摸的具體功能,以及Core Animation底層方法的高級(jí)接口。
????5)但是為什么iOS要基于UIView和CALayer提供兩個(gè)平行的層級(jí)關(guān)系呢?為什么不用一個(gè)簡(jiǎn)單的層級(jí)來(lái)處理所有事情呢?原因在于要做職責(zé)分離,這樣也能避免很多重復(fù)代碼。在iOS和Mac OS兩個(gè)平臺(tái)上,事件和用戶(hù)交互有很多地方的不同,基于多點(diǎn)觸控的用戶(hù)界面和基于鼠標(biāo)鍵盤(pán)有著本質(zhì)的區(qū)別,這就是為什么iOS有UIKit和UIView,但是Mac OS有AppKit和NSView的原因。他們功能上很相似,但是在實(shí)現(xiàn)上有著顯著的區(qū)別。
?繪圖,布局和動(dòng)畫(huà),相比之下就是類(lèi)似Mac筆記本和桌面系列一樣應(yīng)用于iPhone和iPad觸屏的概念。把這種功能的邏輯分開(kāi)并應(yīng)用到獨(dú)立的Core Animation框架,蘋(píng)果就能夠在iOS和Mac OS之間共享代碼,使得對(duì)蘋(píng)果自己的OS開(kāi)發(fā)團(tuán)隊(duì)和第三方開(kāi)發(fā)者去開(kāi)發(fā)兩個(gè)平臺(tái)的應(yīng)用更加便捷。
????實(shí)際上,這里并不是兩個(gè)層級(jí)關(guān)系,而是四個(gè),每一個(gè)都扮演不同的角色,除了視圖層級(jí)和圖層樹(shù)之外,還存在呈現(xiàn)樹(shù)和渲染樹(shù),將在第七章“隱式動(dòng)畫(huà)”和第十二章“性能調(diào)優(yōu)”分別討論。
3.圖層的能力
如果說(shuō)CALayer是UIView內(nèi)部實(shí)現(xiàn)細(xì)節(jié),那我們?yōu)槭裁匆娴亓私馑??蘋(píng)果當(dāng)然為我們提供了優(yōu)美簡(jiǎn)潔的UIView接口,那么我們是否就沒(méi)必要直接去處理Core Animation的細(xì)節(jié)了呢?
????某種意義上說(shuō)的確是這樣,對(duì)一些簡(jiǎn)單的需求來(lái)說(shuō),我們確實(shí)沒(méi)必要處理CALayer,因?yàn)樘O(píng)果已經(jīng)通過(guò)UIView的高級(jí)API間接地使得動(dòng)畫(huà)變得很簡(jiǎn)單。
????但是這種簡(jiǎn)單會(huì)不可避免地帶來(lái)一些靈活上的缺陷。如果6)你略微想在底層做一些改變,或者使用一些蘋(píng)果沒(méi)有在UIView上實(shí)現(xiàn)的接口功能,這時(shí)除了介入Core Animation底層之外別無(wú)選擇。
????我們已經(jīng)證實(shí)了圖層不能像視圖那樣處理觸摸事件,那么他能做哪些視圖不能做的呢?這里有一些UIView沒(méi)有暴露出來(lái)的CALayer的功能:(CALayer高級(jí)用法)
陰影,圓角,帶顏色的邊框
3D變換
非矩形范圍
透明遮罩
多級(jí)非線性動(dòng)畫(huà)
4.使用圖層
?首先我們來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的項(xiàng)目,來(lái)操縱一些layer的屬性。打開(kāi)Xcode,使用Single View Application模板創(chuàng)建一個(gè)工程。
????在屏幕中央創(chuàng)建一個(gè)小視圖(大約200 X 200的尺寸),當(dāng)然你可以手工編碼,或者使用Interface Builder(隨你方便)。確保你的視圖控制器要添加一個(gè)視圖的屬性以便可以直接訪問(wèn)它。我們把它稱(chēng)作layerView。
運(yùn)行項(xiàng)目,應(yīng)該能在淺灰色屏幕背景中看見(jiàn)一個(gè)白色方塊(圖1.3),如果沒(méi)看見(jiàn),可能需要調(diào)整一下背景window或者view的顏色
8動(dòng)畫(huà)?
1> ios界面切換?
2>?iOS中各種動(dòng)畫(huà)的類(lèi)型&特點(diǎn)&使用場(chǎng)景
CAPropertyAnimation
是CAAnimation的子類(lèi),也是個(gè)抽象類(lèi),要想創(chuàng)建動(dòng)畫(huà)對(duì)象,應(yīng)該使用它的兩個(gè)子類(lèi):CABasicAnimation和CAKeyframeAnimation
屬性解析:
keyPath:通過(guò)指定CALayer的一個(gè)屬性名稱(chēng)為keyPath(NSString類(lèi)型),并且對(duì)CALayer的這個(gè)屬性的值進(jìn)行修改,達(dá)到相應(yīng)的動(dòng)畫(huà)效果。比如,指定@”position”為keyPath,就修改CALayer的position屬性的值,以達(dá)到平移的動(dòng)畫(huà)效果
CABasicAnimation
CAPropertyAnimation的子類(lèi)
屬性解析:
fromValue:keyPath相應(yīng)屬性的初始值
toValue:keyPath相應(yīng)屬性的結(jié)束值
隨著動(dòng)畫(huà)的進(jìn)行,在長(zhǎng)度為duration的持續(xù)時(shí)間內(nèi),keyPath相應(yīng)屬性的值從fromValue漸漸地變?yōu)閠oValue
如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在動(dòng)畫(huà)執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫(huà)執(zhí)行后的狀態(tài)。但在實(shí)質(zhì)上,圖層的屬性值還是動(dòng)畫(huà)執(zhí)行前的初始值,并沒(méi)有真正被改變。比如,CALayer的position初始值為(0,0),CABasicAnimation的fromValue為(10,10),toValue為(100,100),雖然動(dòng)畫(huà)執(zhí)行完畢后圖層保持在(100,100)這個(gè)位置,實(shí)質(zhì)上圖層的position還是為(0,0)
CAKeyframeAnimation
CApropertyAnimation的子類(lèi),跟CABasicAnimation的區(qū)別是:CABasicAnimation只能從一個(gè)數(shù)值(fromValue)變到另一個(gè)數(shù)值(toValue),而CAKeyframeAnimation會(huì)使用一個(gè)NSArray保存這些數(shù)值
屬性解析:
values:就是上述的NSArray對(duì)象。里面的元素稱(chēng)為”關(guān)鍵幀”(keyframe)。動(dòng)畫(huà)對(duì)象會(huì)在指定的時(shí)間(duration)內(nèi),依次顯示values數(shù)組中的每一個(gè)關(guān)鍵幀
path:可以設(shè)置一個(gè)CGPathRef\CGMutablePathRef,讓層跟著路徑移動(dòng)。path只對(duì)CALayer的anchorPoint和position起作用。如果你設(shè)置了path,那么values將被忽略
keyTimes:可以為對(duì)應(yīng)的關(guān)鍵幀指定對(duì)應(yīng)的時(shí)間點(diǎn),其取值范圍為0到1.0,keyTimes中的每一個(gè)時(shí)間值都對(duì)應(yīng)values中的每一幀.當(dāng)keyTimes沒(méi)有設(shè)置的時(shí)候,各個(gè)關(guān)鍵幀的時(shí)間是平分的
CABasicAnimation可看做是最多只有2個(gè)關(guān)鍵幀的CAKeyframeAnimation
CAAnimationGroup
CAAnimation的子類(lèi),可以保存一組動(dòng)畫(huà)對(duì)象,將CAAnimationGroup對(duì)象加入層后,組中所有動(dòng)畫(huà)對(duì)象可以同時(shí)并發(fā)運(yùn)行
屬性解析:
animations:用來(lái)保存一組動(dòng)畫(huà)對(duì)象的NSArray
默認(rèn)情況下,一組動(dòng)畫(huà)對(duì)象是同時(shí)運(yùn)行的,也可以通過(guò)設(shè)置動(dòng)畫(huà)對(duì)象的beginTime屬性來(lái)更改動(dòng)畫(huà)的開(kāi)始時(shí)間
CATransition
CAAnimation的子類(lèi),用于做轉(zhuǎn)場(chǎng)動(dòng)畫(huà),能夠?yàn)閷犹峁┮瞥銎聊缓鸵迫肫聊坏膭?dòng)畫(huà)效果。iOS比Mac OS X的轉(zhuǎn)場(chǎng)動(dòng)畫(huà)效果少一點(diǎn)
UINavigationController就是通過(guò)CATransition實(shí)現(xiàn)了將控制器的視圖推入屏幕的動(dòng)畫(huà)效果
屬性解析:
type:動(dòng)畫(huà)過(guò)渡類(lèi)型
subtype:動(dòng)畫(huà)過(guò)渡方向
startProgress:動(dòng)畫(huà)起點(diǎn)(在整體動(dòng)畫(huà)的百分比)
endProgress:動(dòng)畫(huà)終點(diǎn)(在整體動(dòng)畫(huà)的百分比)
UIView動(dòng)畫(huà)
UIKit直接將動(dòng)畫(huà)集成到UIView類(lèi)中,當(dāng)內(nèi)部的一些屬性發(fā)生改變時(shí),UIView將為這些改變提供動(dòng)畫(huà)支持
執(zhí)行動(dòng)畫(huà)所需要的工作由UIView類(lèi)自動(dòng)完成,但仍要在希望執(zhí)行動(dòng)畫(huà)時(shí)通知視圖,為此需要將改變屬性的代碼放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之間
Block動(dòng)畫(huà)
幀動(dòng)畫(huà)
8?.網(wǎng)絡(luò)傳輸
1>DNS是如何工作的
DNS是domain name server的簡(jiǎn)稱(chēng),每個(gè)網(wǎng)絡(luò)的計(jì)算機(jī)都有ip,但是不好記,所以用域名替代(如www.baidu.com),在Internet?上真實(shí)在辨識(shí)機(jī)器的還是IP,所以當(dāng)使用者輸入Domain Name?后,瀏覽器必須要先去一臺(tái)有Domain Name?和IP?對(duì)應(yīng)資料的主機(jī)去查詢(xún)這臺(tái)電腦的IP,而這臺(tái)被查詢(xún)的主機(jī),我們稱(chēng)它為Domain Name Server,簡(jiǎn)稱(chēng)DNS,例如:當(dāng)你輸入www.pchome.com.tw時(shí),瀏覽器會(huì)將www.pchome.com.tw這個(gè)名字傳送到離他最近的DNS Server?去做辨識(shí),如果查到,則會(huì)傳回這臺(tái)主機(jī)的IP,進(jìn)而跟它索取資料,但如果沒(méi)查到,就會(huì)發(fā)生類(lèi)似DNS NOT FOUND?的情形,所以一旦DNS Server當(dāng)機(jī),就像是路標(biāo)完全被毀壞,沒(méi)有人知道該把資料送到那里
9?.AFN
1>實(shí)現(xiàn)原理
AFN的直接操作對(duì)象AFHTTPClient不同于ASI,是一個(gè)實(shí)現(xiàn)了NSCoding和NSCopying協(xié)議的NSObject子類(lèi)。AFHTTPClient是一個(gè)封裝了一系列操作方法的“工具類(lèi)”,處理請(qǐng)求的操作類(lèi)是一系列單獨(dú)的,基于NSOperation封裝的,AFURLConnectionOperation的子類(lèi)。AFN的示例代碼中通過(guò)一個(gè)靜態(tài)方法,使用dispatch_once()的方式創(chuàng)建AFHTTPClient的共享實(shí)例,這也是官方建議的使用方法。在創(chuàng)建AFHTTPClient的初始化方法中,創(chuàng)建了OperationQueue并設(shè)置一系列參數(shù)默認(rèn)值。在getPath:parameters:success:failure方法中創(chuàng)建NSURLRequest,以NSURLRequest對(duì)象實(shí)例作為參數(shù),創(chuàng)建一個(gè)NSOperation,并加入在初始化發(fā)方中創(chuàng)建的NSOperationQueue。以上操作都是在主線程中完成的。在NSOperation的start方法中,以此前創(chuàng)建的NSURLRequest對(duì)象為參數(shù)創(chuàng)建NSURLConnection并開(kāi)啟連結(jié)。
2>?傳遞指針如何使一個(gè)方法返回多個(gè)返回值
傳參指針變量的地址,方法內(nèi)部通過(guò)*運(yùn)算符使用該地址可以修改該地址保存的內(nèi)容(引用對(duì)象的地址),當(dāng)外部再次使用該指針變量取出引用對(duì)象時(shí),引用對(duì)象已經(jīng)在方法內(nèi)部發(fā)生了改變,指針變量指向其他數(shù)據(jù),相當(dāng)于方法的返回值(經(jīng)方法處理后生成的外部可使用的結(jié)果數(shù)據(jù)).
9?AFNetworking&ASIHttpRequest&MKNetWorking
1、AFN的底層實(shí)現(xiàn)基于OC的NSURLConnection和NSURLSession
2、ASI的底層實(shí)現(xiàn)基于純C語(yǔ)言的CFNetwork框架
3、因?yàn)镹SURLConnection和NSURLSession是在CFNetwork之上的一層封裝,因此ASI的運(yùn)行性能高于AFN
二、對(duì)服務(wù)器返回的數(shù)據(jù)處理
1、ASI沒(méi)有直接提供對(duì)服務(wù)器數(shù)據(jù)處理的方式,直接返回的是NSData/NSString
2、AFN提供了多種對(duì)服務(wù)器數(shù)據(jù)處理的方式
(1)JSON處理-直接返回NSDictionary或者NSArray
(2)XML處理-返回的是xml類(lèi)型數(shù)據(jù),需對(duì)其進(jìn)行解析
(3)其他類(lèi)型數(shù)據(jù)處理
三、監(jiān)聽(tīng)請(qǐng)求過(guò)程
1、AFN提供了success和failure兩個(gè)block來(lái)監(jiān)聽(tīng)請(qǐng)求的過(guò)程(只能監(jiān)聽(tīng)成功和失?。?/p>
* success :?請(qǐng)求成功后調(diào)用
* failure :?請(qǐng)求失敗后調(diào)用
2、ASI提供了3套方案,每一套方案都能監(jiān)聽(tīng)請(qǐng)求的完整過(guò)程
(監(jiān)聽(tīng)請(qǐng)求開(kāi)始、接收到響應(yīng)頭信息、接受到具體數(shù)據(jù)、接受完畢、請(qǐng)求失?。?/p>
* 成為代理,遵守協(xié)議,實(shí)現(xiàn)協(xié)議中的代理方法
* 成為代理,不遵守協(xié)議,自定義代理方法
* 設(shè)置block
四、在文件下載和文件上傳的使用難易度
1、AFN
*不容易實(shí)現(xiàn)監(jiān)聽(tīng)下載進(jìn)度和上傳進(jìn)度
*不容易實(shí)現(xiàn)斷點(diǎn)續(xù)傳
*一般只用來(lái)下載不大的文件
2、ASI(ipv6)
*非常容易實(shí)現(xiàn)下載和上傳
*非常容易監(jiān)聽(tīng)下載進(jìn)度和上傳進(jìn)度
*非常容易實(shí)現(xiàn)斷點(diǎn)續(xù)傳
*下載大文件或小文件均可
3、實(shí)現(xiàn)下載上傳推薦使用ASI
五、網(wǎng)絡(luò)監(jiān)控
1、AFN自己封裝了網(wǎng)絡(luò)監(jiān)控類(lèi),易使用
2、ASI使用的是Reachability,因?yàn)槭褂肅ocoaPods下載ASI時(shí),會(huì)同步下載Reachability,但Reachability作為網(wǎng)絡(luò)監(jiān)控使用較為復(fù)雜(相對(duì)于AFN的網(wǎng)絡(luò)監(jiān)控類(lèi)來(lái)說(shuō))
3、推薦使用AFN做網(wǎng)絡(luò)監(jiān)控-AFNetworkReachabilityManager
六、ASI提供的其他實(shí)用功能
1、控制信號(hào)旁邊的圈圈要不要在請(qǐng)求過(guò)程中轉(zhuǎn)
2、可以輕松地設(shè)置請(qǐng)求之間的依賴(lài):每一個(gè)請(qǐng)求都是一個(gè)NSOperation對(duì)象
3、可以統(tǒng)一管理所有請(qǐng)求(還專(zhuān)門(mén)提供了一個(gè)叫做ASINetworkQueue來(lái)管理所有的請(qǐng)求對(duì)象)
* 暫停/恢復(fù)/取消所有的請(qǐng)求
* 監(jiān)聽(tīng)整個(gè)隊(duì)列中所有請(qǐng)求的下載進(jìn)度和上傳進(jìn)度
MKNetworkKit?是一個(gè)使用十分方便,功能又十分強(qiáng)大、完整的iOS網(wǎng)絡(luò)編程代碼庫(kù)。它只有兩個(gè)類(lèi), 它的目標(biāo)是使用像AFNetworking這么簡(jiǎn)單,而功能像ASIHTTPRequest(已經(jīng)停止維護(hù))那么強(qiáng)大。它除了擁有?AFNetworking和ASIHTTPRequest所有功能以外,還有一些新特色,包括:
?1、高度的輕量級(jí),僅僅只有2個(gè)主類(lèi)
?2、自主操作多個(gè)網(wǎng)絡(luò)請(qǐng)求
?3、更加準(zhǔn)確的顯示網(wǎng)絡(luò)活動(dòng)指標(biāo)
?4、自動(dòng)設(shè)置網(wǎng)絡(luò)速度,實(shí)現(xiàn)自動(dòng)的2G、3G、wifi切換
?5、自動(dòng)緩沖技術(shù)的完美應(yīng)用,實(shí)現(xiàn)網(wǎng)絡(luò)操作記憶功能,當(dāng)你掉線了又上線后,會(huì)繼續(xù)執(zhí)行未完成的網(wǎng)絡(luò)請(qǐng)求
?6、可以實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求的暫停功能
?7、準(zhǔn)確無(wú)誤的成功執(zhí)行一次網(wǎng)絡(luò)請(qǐng)求,摒棄后臺(tái)的多次請(qǐng)求浪費(fèi)
?8、支持圖片緩沖
?9、支持ARC機(jī)制
?10、在整個(gè)app中可以只用一個(gè)隊(duì)列(queue),隊(duì)列的大小可以自動(dòng)調(diào)整
10.性能優(yōu)化
1>?如何進(jìn)行性能優(yōu)化
1.1>?內(nèi)存優(yōu)化的點(diǎn)?重用?懶加載
1.2>?渲染優(yōu)化?盡量使用不透明的圖?把views?設(shè)置為透明
1.3>?在ImageView設(shè)置前,盡量先調(diào)整好圖片大小?尤其放在uiscrolliview中自動(dòng)縮放耗能
1.4>?避免使用過(guò)大的xib?和分鏡的區(qū)別?一次性加載
1.5>?不要阻塞主線程?除渲染,觸摸響應(yīng)等?盡量異步處理?如存儲(chǔ),網(wǎng)絡(luò)?異步線程通知?
1.6>?緩存?網(wǎng)絡(luò)響應(yīng),圖片,計(jì)算結(jié)果(行高)?網(wǎng)絡(luò)響應(yīng)NSUrlconnection默認(rèn)緩存request,設(shè)置策略?非網(wǎng)絡(luò)請(qǐng)求使用nscache nsdictionary
1.7>?避免反復(fù)處理數(shù)據(jù)?在服務(wù)器端和客戶(hù)端使用相同的數(shù)據(jù)結(jié)構(gòu)
1.8>?選擇正確的數(shù)據(jù)格式?json?速度快解析方便?xml?sax方式逐行解析解析大文件不占用內(nèi)存和損失性能
1.9>?優(yōu)化tableview?重用cell?緩存行高cell子視圖盡量少且不透明?
1.10>?選擇正確的數(shù)據(jù)存儲(chǔ)選項(xiàng)?plist nscoding NSUserDefaults sqlite coredata
?