ios面試題7

三.數(shù)據(jù)存儲

1.數(shù)據(jù)存儲技術(shù)

1>?數(shù)據(jù)存儲的幾種方式?

XML屬性列表(plist)歸檔

Preference(偏好設(shè)置)

NSKeyedArchiver歸檔(NSCoding)

SQLite3

Core Data

2>?各自特點

Plist:

屬性列表是一種XML格式的文件,拓展名為plist

如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表文件中

?將一個NSDictionary對象歸檔到一個plist屬性列表中

//?將數(shù)據(jù)封裝成字典

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

[dict setObject:@"母雞" forKey:@"name"];

//?將字典持久化到Documents/stu.plist文件中

[dict writeToFile:path atomically:YES];


面試考點:

1.??plist的根節(jié)點只能是NSDictionary和NSArray,所以存儲內(nèi)容必須轉(zhuǎn)為對象類型

2.??使用場景?功能動態(tài)更新應用級別數(shù)據(jù)更新?XML的替代品


偏好設(shè)置:

每個應用都有個NSUserDefaults實例,通過它來存取偏好設(shè)置

比如,保存用戶名、字體大小、是否自動登錄

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:@"itcast" forKey:@"username"];

[defaults setFloat:18.0f forKey:@"text_size"];

[defaults setBool:YES forKey:@"auto_login"];


面試考點:

1.??使用場景保存應用信息

2.??特點?不會自動刪除,itune同步,不適合存大數(shù)據(jù)

3.??使用單例模式、

4.??直接存取結(jié)構(gòu)體,基本數(shù)據(jù)類型,無需轉(zhuǎn)換

5.??即時操作注意同步


歸檔:

如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔和恢復

不是所有的對象都可以直接用這種方法進行歸檔,只有遵守了NSCoding協(xié)議的對象才可以

NSCoding協(xié)議有2個方法:

encodeWithCoder:

每次歸檔對象時,都會調(diào)用這個方法。一般在這個方法里面指定如何歸檔對象中的每個實例變量,可以使用encodeObject:forKey:方法歸檔實例變量

initWithCoder:

每次從文件中恢復(解碼)對象時,都會調(diào)用這個方法。一般在這個方法里面指定如何解碼文件中的數(shù)據(jù)為對象的實例變量,可以使用decodeObject:forKey方法解碼實例變量

歸檔一個NSArray對象到Documents/array.archive

NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];

[NSKeyedArchiver archiveRootObject:array toFile:path];


?使用archiveRootObject:toFile:方法可以將一個對象直接寫入到一個文件中,但有時候可能想將多個對象寫入到同一個文件中,那么就要使用NSData來進行歸檔對象

??歸檔(編碼)

//?新建一塊可變數(shù)據(jù)區(qū)

NSMutableData *data = [NSMutableData data];

//?將數(shù)據(jù)區(qū)連接到一個NSKeyedArchiver對象

NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];

//?開始存檔對象,存檔的數(shù)據(jù)都會存儲到NSMutableData中

[archiver encodeObject:person1 forKey:@"person1"];

[archiver encodeObject:person2 forKey:@"person2"];

//?存檔完畢(一定要調(diào)用這個方法)

[archiver finishEncoding];

//?將存檔的數(shù)據(jù)寫入文件

[data writeToFile:path atomically:YES];


????恢復(解碼)

//?從文件中讀取數(shù)據(jù)

NSData *data = [NSData dataWithContentsOfFile:path];

//?根據(jù)數(shù)據(jù),解析成一個NSKeyedUnarchiver對象

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

Person *person1 = [unarchiver decodeObjectForKey:@"person1"];

Person *person2 = [unarchiver decodeObjectForKey:@"person2"];

//?恢復完畢

[unarchiver finishDecoding];


利用歸檔實現(xiàn)深復制

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];

//?解析data,生成一個新的Person對象

Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];


?面試考點:

1.??特點:存入Document,itune同步,不會自動刪除,可存放大型用戶數(shù)據(jù)

2.??使用場景:用戶產(chǎn)生的數(shù)據(jù),如游戲,操作記錄等等

3.??可保存自定義對象,需要遵守NSCoding協(xié)議,實現(xiàn)對應的encodeWithCoder?initWithCoder?方法

4.??和NSData的配合

4.1>?多對象單目錄存儲

4.2>?字典/數(shù)組內(nèi)容的深拷貝

5.??不能直接存基本類型和結(jié)構(gòu)體,需要轉(zhuǎn)成對象?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é)點類型讀取plist文件

NSArray *apps = [NSArray arrayWithContentsOfFile:path];


2.數(shù)據(jù)庫技術(shù)(SQLite&CoreData)

1> SQLite和CoreData的區(qū)別

1.1> CoreData可以在一個對象更新時,其關(guān)聯(lián)的對象也會隨著更新,相當于你更新一張表時,其關(guān)聯(lián)的其他表的也回隨著更新

1.2> CoreData提供更簡單的性能管理機制,可以限制查詢記錄的總數(shù),這個類會自動更新其緩存

1.3>?多表查詢方面,CoreData沒有SQL直觀,沒有類似外連接,左連接等操作.


iOS App升級安裝 - CoreData數(shù)據(jù)庫升級

1.選中你的mydata.xcdatamodeld文件,選擇菜單editor->Add Model Version?比如取名:mydata2.xcdatamodel

2.設(shè)置當前版本

3..修改新數(shù)據(jù)模型mydata2,在新的文件上添加字段及表

4.刪除原來的類文件,重新生成下類。在appdelegate中添加*optionsDictionary,原來options:nil?改成options:optionsDictionary

5.重新編譯下程序。

增加模型版本——->選擇最新的版本——->選擇表,添加字段——>刪除之前的類,重新生成。


2> iOS內(nèi)存區(qū)域

2.1>棧區(qū)

由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等.其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧.

2.2>堆區(qū)

一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時由系統(tǒng)回收

2.3>全局區(qū)(靜態(tài)區(qū))

全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量相鄰的另一塊區(qū)域.

全局區(qū)分為未初始化全局區(qū): .bss段和初始化全局區(qū): data段.

2.4>常量區(qū)

常量字符串就是放在常量區(qū)

2.5>代碼區(qū)

存放函數(shù)體的二進制代碼


3.?你是如何優(yōu)化內(nèi)存管理

1>使用ARC

2>延遲加載?懶加載?

3>重用?在正確的地方使用reuseIndentifier?

4>緩存?NSCache?保存計算數(shù)據(jù)

5>處理內(nèi)存警告?移除對緩存,圖片object?和其他一些可以重創(chuàng)建的objects?的強引用

?5.1> app delegate?中使用`applicationDidReceiveMemoryWarning:`?的方法

?5.2>?自定義UIViewController?的子類(subclass)?中覆蓋`didReceiveMemoryWarning`

?5.3>?在自定義類中注冊并接收UIApplicationDidReceiveMemoryWarningNotification?的通知

6>重用大開銷對象?NSDateFormatter?和NSCalendar?懶加載/單例?_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy”;?設(shè)置和創(chuàng)建速度一樣慢

7>自動釋放池?手動添加自動釋放池

8>是否緩存圖片imageNamed?imageWithContentOfFile

9>混編

10>循環(huán)引用?delegate block nstimer

11>?移除kvo?nsnotificationcenter?并未強引用,只記錄內(nèi)存地址,野指針報錯?UIViewController自動移除?一般在dealloc中

13> performselector?延遲操作??[NSObject cancelPreviousPerformRequestsWithTarget:self]


4.?循環(huán)引用

delegate屬性的內(nèi)存策略

block循環(huán)引用?實際場景

5. autorelease的使用

1>工廠方法為什么不釋放對象

很多類方法為了在代碼塊結(jié)束時引用的對象不會因無強引用而被釋放內(nèi)存采用自動釋放的方式,當其最近的自動釋放池釋放時該對象才會釋放.

2> ARC下autorelease的使用場景

ARC中手動添加autoreleasepool可用于提前釋放使用自動釋放策略的對象,防止大量自動釋放的對象堆積造成內(nèi)存峰值過高.

3>自動釋放池如何工作

自動釋放池時棧結(jié)構(gòu),每個線程的runloop運行時都會自動創(chuàng)建自動釋放池,程序員可以代碼手動創(chuàng)建自動釋放池,自動釋放的對象會被添加到最近的(棧頂)自動釋放池中,系統(tǒng)自動創(chuàng)建的自動釋放池在每個運行循環(huán)結(jié)束時銷毀釋放池并給池中所有對象發(fā)release消息,手動創(chuàng)建釋放池在所在代碼塊結(jié)束時銷毀釋放池并發(fā)消息統(tǒng)一release


避免內(nèi)存峰值

SDWebimage中加載gif圖片?大循環(huán)

棧結(jié)構(gòu)棧頂

統(tǒng)一發(fā)release消息


5>ARC的實現(xiàn)原理

在程序預編譯階段,將ARC?的代碼轉(zhuǎn)換為非ARC?的代碼,自動加入release、autorelease、retain

6.Runloop

1>?每個線程上都有一個runloop,主線程默認開啟,輔助線程需要手動開啟,主要用于

??使用端口或自定義輸入源來和其他線程通信

??使用線程的定時器

??Cocoa中使用任何performSelector…的方法

??使線程周期性工作

2> runloop的工作流程

7?Core Graphics繪圖的步驟:

獲取上下文(畫布)

創(chuàng)建路徑(自定義或者調(diào)用系統(tǒng)的API)并添加到上下文中。

進行繪圖內(nèi)容的設(shè)置(畫筆顏色、粗細、填充區(qū)域顏色、陰影、連接點形狀等)

開始繪圖(CGContextDrawPath)

釋放路徑(CGPathRelease)?

(1)核心圖形Core Graphics是用來實現(xiàn)用戶界面視覺設(shè)計方案的重要技術(shù)框架

(2)核心動畫Core Animation提供了一套用于創(chuàng)建和渲染動態(tài)交互效果的簡單易行的解決方案,通過與UIKit的緊密配合,核心動畫可以將界面交互對象與動畫過渡效果進行完美地整合。

(3)UIkit是用來打造iOS應用的最重要的圖形技術(shù)框架,它提供了用于構(gòu)造觸屏設(shè)備用戶界面的全部工具和資源,并在整個交互體驗的塑造過程中扮演著至關(guān)重要的角色

8點講動畫和layer ,view的區(qū)別

1)觸摸

2)layer?特有

3)不觸摸的替代

4)屬性

5)為什么不合二為1

6)高級用法

1.圖層與視圖

一個視圖就是在屏幕上顯示的一個矩形塊(比如圖片,文字或者視頻),它能夠1)攔截類似于鼠標點擊或者觸摸手勢等用戶輸入。視圖在層級關(guān)系中可以互相嵌套,一個視圖可以管理它的所有子視圖的位置。

所有的視圖都從一個叫做UIVIew的基類派生而來,UIView可以處理觸摸?2)(layer不行,但是layer有錨點和position的概念選裝變換的時候用),可以支持基于Core Graphics繪圖,可以做仿射變換(例如旋轉(zhuǎn)或者縮放),或者簡單的類似于滑動或者漸變的動畫。

CALayer類在概念上和UIView類似,同樣也是一些被層級關(guān)系樹管理的矩形塊,同樣也可以包含一些內(nèi)容(像圖片,文本或者背景色),管理子圖層的位置。它們有一些方法和屬性用來做動畫和變換。和UIView最大的不同是CALayer不處理用戶的交互。

CALayer并不清楚具體的響應鏈(iOS通過視圖層級關(guān)系用來傳送觸摸事件的機制),于是它并不能夠響應事件,即使3)它提供了一些方法來判斷是否一個觸點在圖層的范圍之內(nèi)。

2.平行的層級關(guān)系

?4)每一個UIview都有一個CALayer實例的圖層屬性,也就是所謂的backing layer,視圖的職責就是創(chuàng)建并管理這個圖層,以確保當子視圖在層級關(guān)系中添加或者被移除的時候,他們關(guān)聯(lián)的圖層也同樣對應在層級關(guān)系樹當中有相同的操作。

實際上這些背后關(guān)聯(lián)的圖層才是真正用來在屏幕上顯示和做動畫,UIView僅僅是對它的一個封裝,提供了一些iOS類似于處理觸摸的具體功能,以及Core Animation底層方法的高級接口。

????5)但是為什么iOS要基于UIView和CALayer提供兩個平行的層級關(guān)系呢?為什么不用一個簡單的層級來處理所有事情呢?原因在于要做職責分離,這樣也能避免很多重復代碼。在iOS和Mac OS兩個平臺上,事件和用戶交互有很多地方的不同,基于多點觸控的用戶界面和基于鼠標鍵盤有著本質(zhì)的區(qū)別,這就是為什么iOS有UIKit和UIView,但是Mac OS有AppKit和NSView的原因。他們功能上很相似,但是在實現(xiàn)上有著顯著的區(qū)別。

?繪圖,布局和動畫,相比之下就是類似Mac筆記本和桌面系列一樣應用于iPhone和iPad觸屏的概念。把這種功能的邏輯分開并應用到獨立的Core Animation框架,蘋果就能夠在iOS和Mac OS之間共享代碼,使得對蘋果自己的OS開發(fā)團隊和第三方開發(fā)者去開發(fā)兩個平臺的應用更加便捷。

????實際上,這里并不是兩個層級關(guān)系,而是四個,每一個都扮演不同的角色,除了視圖層級和圖層樹之外,還存在呈現(xiàn)樹和渲染樹,將在第七章“隱式動畫”和第十二章“性能調(diào)優(yōu)”分別討論。

3.圖層的能力

如果說CALayer是UIView內(nèi)部實現(xiàn)細節(jié),那我們?yōu)槭裁匆娴亓私馑??蘋果當然為我們提供了優(yōu)美簡潔的UIView接口,那么我們是否就沒必要直接去處理Core Animation的細節(jié)了呢?

????某種意義上說的確是這樣,對一些簡單的需求來說,我們確實沒必要處理CALayer,因為蘋果已經(jīng)通過UIView的高級API間接地使得動畫變得很簡單。

????但是這種簡單會不可避免地帶來一些靈活上的缺陷。如果6)你略微想在底層做一些改變,或者使用一些蘋果沒有在UIView上實現(xiàn)的接口功能,這時除了介入Core Animation底層之外別無選擇。

????我們已經(jīng)證實了圖層不能像視圖那樣處理觸摸事件,那么他能做哪些視圖不能做的呢?這里有一些UIView沒有暴露出來的CALayer的功能:(CALayer高級用法)

陰影,圓角,帶顏色的邊框

3D變換

非矩形范圍

透明遮罩

多級非線性動畫

4.使用圖層

?首先我們來創(chuàng)建一個簡單的項目,來操縱一些layer的屬性。打開Xcode,使用Single View Application模板創(chuàng)建一個工程。

????在屏幕中央創(chuàng)建一個小視圖(大約200 X 200的尺寸),當然你可以手工編碼,或者使用Interface Builder(隨你方便)。確保你的視圖控制器要添加一個視圖的屬性以便可以直接訪問它。我們把它稱作layerView。

運行項目,應該能在淺灰色屏幕背景中看見一個白色方塊(圖1.3),如果沒看見,可能需要調(diào)整一下背景window或者view的顏色


8動畫?

1> ios界面切換?

2>?iOS中各種動畫的類型&特點&使用場景

CAPropertyAnimation

是CAAnimation的子類,也是個抽象類,要想創(chuàng)建動畫對象,應該使用它的兩個子類:CABasicAnimation和CAKeyframeAnimation

屬性解析:

keyPath:通過指定CALayer的一個屬性名稱為keyPath(NSString類型),并且對CALayer的這個屬性的值進行修改,達到相應的動畫效果。比如,指定@”position”為keyPath,就修改CALayer的position屬性的值,以達到平移的動畫效果


CABasicAnimation

CAPropertyAnimation的子類

屬性解析:

fromValue:keyPath相應屬性的初始值

toValue:keyPath相應屬性的結(jié)束值

隨著動畫的進行,在長度為duration的持續(xù)時間內(nèi),keyPath相應屬性的值從fromValue漸漸地變?yōu)閠oValue

如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在動畫執(zhí)行完畢后,圖層會保持顯示動畫執(zhí)行后的狀態(tài)。但在實質(zhì)上,圖層的屬性值還是動畫執(zhí)行前的初始值,并沒有真正被改變。比如,CALayer的position初始值為(0,0),CABasicAnimation的fromValue為(10,10),toValue為(100,100),雖然動畫執(zhí)行完畢后圖層保持在(100,100)這個位置,實質(zhì)上圖層的position還是為(0,0)


CAKeyframeAnimation

CApropertyAnimation的子類,跟CABasicAnimation的區(qū)別是:CABasicAnimation只能從一個數(shù)值(fromValue)變到另一個數(shù)值(toValue),而CAKeyframeAnimation會使用一個NSArray保存這些數(shù)值

屬性解析:

values:就是上述的NSArray對象。里面的元素稱為”關(guān)鍵幀”(keyframe)。動畫對象會在指定的時間(duration)內(nèi),依次顯示values數(shù)組中的每一個關(guān)鍵幀

path:可以設(shè)置一個CGPathRef\CGMutablePathRef,讓層跟著路徑移動。path只對CALayer的anchorPoint和position起作用。如果你設(shè)置了path,那么values將被忽略

keyTimes:可以為對應的關(guān)鍵幀指定對應的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應values中的每一幀.當keyTimes沒有設(shè)置的時候,各個關(guān)鍵幀的時間是平分的

CABasicAnimation可看做是最多只有2個關(guān)鍵幀的CAKeyframeAnimation


CAAnimationGroup

CAAnimation的子類,可以保存一組動畫對象,將CAAnimationGroup對象加入層后,組中所有動畫對象可以同時并發(fā)運行

屬性解析:

animations:用來保存一組動畫對象的NSArray

默認情況下,一組動畫對象是同時運行的,也可以通過設(shè)置動畫對象的beginTime屬性來更改動畫的開始時間


CATransition

CAAnimation的子類,用于做轉(zhuǎn)場動畫,能夠為層提供移出屏幕和移入屏幕的動畫效果。iOS比Mac OS X的轉(zhuǎn)場動畫效果少一點

UINavigationController就是通過CATransition實現(xiàn)了將控制器的視圖推入屏幕的動畫效果

屬性解析:

type:動畫過渡類型

subtype:動畫過渡方向

startProgress:動畫起點(在整體動畫的百分比)

endProgress:動畫終點(在整體動畫的百分比)


UIView動畫

UIKit直接將動畫集成到UIView類中,當內(nèi)部的一些屬性發(fā)生改變時,UIView將為這些改變提供動畫支持

執(zhí)行動畫所需要的工作由UIView類自動完成,但仍要在希望執(zhí)行動畫時通知視圖,為此需要將改變屬性的代碼放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之間


Block動畫


幀動畫


8?.網(wǎng)絡(luò)傳輸

1>DNS是如何工作的

DNS是domain name server的簡稱,每個網(wǎng)絡(luò)的計算機都有ip,但是不好記,所以用域名替代(如www.baidu.com),在Internet?上真實在辨識機器的還是IP,所以當使用者輸入Domain Name?后,瀏覽器必須要先去一臺有Domain Name?和IP?對應資料的主機去查詢這臺電腦的IP,而這臺被查詢的主機,我們稱它為Domain Name Server,簡稱DNS,例如:當你輸入www.pchome.com.tw時,瀏覽器會將www.pchome.com.tw這個名字傳送到離他最近的DNS Server?去做辨識,如果查到,則會傳回這臺主機的IP,進而跟它索取資料,但如果沒查到,就會發(fā)生類似DNS NOT FOUND?的情形,所以一旦DNS Server當機,就像是路標完全被毀壞,沒有人知道該把資料送到那里

9?.AFN

1>實現(xiàn)原理

AFN的直接操作對象AFHTTPClient不同于ASI,是一個實現(xiàn)了NSCoding和NSCopying協(xié)議的NSObject子類。AFHTTPClient是一個封裝了一系列操作方法的“工具類”,處理請求的操作類是一系列單獨的,基于NSOperation封裝的,AFURLConnectionOperation的子類。AFN的示例代碼中通過一個靜態(tài)方法,使用dispatch_once()的方式創(chuàng)建AFHTTPClient的共享實例,這也是官方建議的使用方法。在創(chuàng)建AFHTTPClient的初始化方法中,創(chuàng)建了OperationQueue并設(shè)置一系列參數(shù)默認值。在getPath:parameters:success:failure方法中創(chuàng)建NSURLRequest,以NSURLRequest對象實例作為參數(shù),創(chuàng)建一個NSOperation,并加入在初始化發(fā)方中創(chuàng)建的NSOperationQueue。以上操作都是在主線程中完成的。在NSOperation的start方法中,以此前創(chuàng)建的NSURLRequest對象為參數(shù)創(chuàng)建NSURLConnection并開啟連結(jié)。


2>?傳遞指針如何使一個方法返回多個返回值

傳參指針變量的地址,方法內(nèi)部通過*運算符使用該地址可以修改該地址保存的內(nèi)容(引用對象的地址),當外部再次使用該指針變量取出引用對象時,引用對象已經(jīng)在方法內(nèi)部發(fā)生了改變,指針變量指向其他數(shù)據(jù),相當于方法的返回值(經(jīng)方法處理后生成的外部可使用的結(jié)果數(shù)據(jù)).

9?AFNetworking&ASIHttpRequest&MKNetWorking

1、AFN的底層實現(xiàn)基于OC的NSURLConnection和NSURLSession

2、ASI的底層實現(xiàn)基于純C語言的CFNetwork框架

3、因為NSURLConnection和NSURLSession是在CFNetwork之上的一層封裝,因此ASI的運行性能高于AFN

二、對服務(wù)器返回的數(shù)據(jù)處理

1、ASI沒有直接提供對服務(wù)器數(shù)據(jù)處理的方式,直接返回的是NSData/NSString

2、AFN提供了多種對服務(wù)器數(shù)據(jù)處理的方式

(1)JSON處理-直接返回NSDictionary或者NSArray

(2)XML處理-返回的是xml類型數(shù)據(jù),需對其進行解析

(3)其他類型數(shù)據(jù)處理

三、監(jiān)聽請求過程

1、AFN提供了success和failure兩個block來監(jiān)聽請求的過程(只能監(jiān)聽成功和失?。?/p>

* success :?請求成功后調(diào)用

* failure :?請求失敗后調(diào)用

2、ASI提供了3套方案,每一套方案都能監(jiān)聽請求的完整過程

(監(jiān)聽請求開始、接收到響應頭信息、接受到具體數(shù)據(jù)、接受完畢、請求失?。?/p>

* 成為代理,遵守協(xié)議,實現(xiàn)協(xié)議中的代理方法

* 成為代理,不遵守協(xié)議,自定義代理方法

* 設(shè)置block

四、在文件下載和文件上傳的使用難易度

1、AFN

*不容易實現(xiàn)監(jiān)聽下載進度和上傳進度

*不容易實現(xiàn)斷點續(xù)傳

*一般只用來下載不大的文件

2、ASI(ipv6)

*非常容易實現(xiàn)下載和上傳

*非常容易監(jiān)聽下載進度和上傳進度

*非常容易實現(xiàn)斷點續(xù)傳

*下載大文件或小文件均可

3、實現(xiàn)下載上傳推薦使用ASI


五、網(wǎng)絡(luò)監(jiān)控

1、AFN自己封裝了網(wǎng)絡(luò)監(jiān)控類,易使用

2、ASI使用的是Reachability,因為使用CocoaPods下載ASI時,會同步下載Reachability,但Reachability作為網(wǎng)絡(luò)監(jiān)控使用較為復雜(相對于AFN的網(wǎng)絡(luò)監(jiān)控類來說)

3、推薦使用AFN做網(wǎng)絡(luò)監(jiān)控-AFNetworkReachabilityManager

六、ASI提供的其他實用功能

1、控制信號旁邊的圈圈要不要在請求過程中轉(zhuǎn)

2、可以輕松地設(shè)置請求之間的依賴:每一個請求都是一個NSOperation對象

3、可以統(tǒng)一管理所有請求(還專門提供了一個叫做ASINetworkQueue來管理所有的請求對象)

* 暫停/恢復/取消所有的請求

* 監(jiān)聽整個隊列中所有請求的下載進度和上傳進度


MKNetworkKit?是一個使用十分方便,功能又十分強大、完整的iOS網(wǎng)絡(luò)編程代碼庫。它只有兩個類, 它的目標是使用像AFNetworking這么簡單,而功能像ASIHTTPRequest(已經(jīng)停止維護)那么強大。它除了擁有?AFNetworking和ASIHTTPRequest所有功能以外,還有一些新特色,包括:

?1、高度的輕量級,僅僅只有2個主類

?2、自主操作多個網(wǎng)絡(luò)請求

?3、更加準確的顯示網(wǎng)絡(luò)活動指標

?4、自動設(shè)置網(wǎng)絡(luò)速度,實現(xiàn)自動的2G、3G、wifi切換

?5、自動緩沖技術(shù)的完美應用,實現(xiàn)網(wǎng)絡(luò)操作記憶功能,當你掉線了又上線后,會繼續(xù)執(zhí)行未完成的網(wǎng)絡(luò)請求

?6、可以實現(xiàn)網(wǎng)絡(luò)請求的暫停功能

?7、準確無誤的成功執(zhí)行一次網(wǎng)絡(luò)請求,摒棄后臺的多次請求浪費

?8、支持圖片緩沖

?9、支持ARC機制

?10、在整個app中可以只用一個隊列(queue),隊列的大小可以自動調(diào)整




10.性能優(yōu)化

1>?如何進行性能優(yōu)化

1.1>?內(nèi)存優(yōu)化的點?重用?懶加載

1.2>?渲染優(yōu)化?盡量使用不透明的圖?把views?設(shè)置為透明

1.3>?在ImageView設(shè)置前,盡量先調(diào)整好圖片大小?尤其放在uiscrolliview中自動縮放耗能

1.4>?避免使用過大的xib?和分鏡的區(qū)別?一次性加載

1.5>?不要阻塞主線程?除渲染,觸摸響應等?盡量異步處理?如存儲,網(wǎng)絡(luò)?異步線程通知?

1.6>?緩存?網(wǎng)絡(luò)響應,圖片,計算結(jié)果(行高)?網(wǎng)絡(luò)響應NSUrlconnection默認緩存request,設(shè)置策略?非網(wǎng)絡(luò)請求使用nscache nsdictionary

1.7>?避免反復處理數(shù)據(jù)?在服務(wù)器端和客戶端使用相同的數(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ù)存儲選項?plist nscoding NSUserDefaults sqlite coredata

?

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

相關(guān)閱讀更多精彩內(nèi)容

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