iOS Foundation 框架簡介(下)

iOS Foundation 框架簡介(上)

接iOS Foundation 框架簡介(上)的內繼續(xù)介紹Foundation框架內容

站在前輩的肩膀上前行

UIKit框架和Foundation框架

011901266024074.jpg

所有的Mac OS X和IOS程序都是由大量的對象構成,而這些對象的根對象都是NSObject,NSObject就處在Foundation框架之中
簡書
Foundation框架大致內容

011902445406430.jpg
011902458525930.jpg
011903203057004.jpg

網(wǎng)絡請求類---URL

  • NSCachedURLResponse

NSCachedURLResponse 是個包含 NSURLResponse 以及它對應的緩存中的 NSData 的類,對URL請求的緩存響應。
NSCachedURLResponse對象以NSURLResponse對象的形式提供服務器的響應元數(shù)據(jù),以及包含實際緩存的內容數(shù)據(jù)的NSData對象。 它的存儲策略決定了響應是應該緩存在磁盤,內存中還是根本不緩存。緩存的響應還包含用戶信息字典,您可以在其中存儲有關緩存項目的特定于應用程序的信息。
NSURLCache類存儲和檢索NSCachedURLResponse的實例。

  • NSURLCache

NSURLCache 為您的應用的 URL 請求提供了內存中以及磁盤上的綜合緩存機制。將URL請求映射到緩存的響應對象的對象。 作為基礎類庫 URL 加載系統(tǒng) 的一部分,任何通過 NSURLConnection 加載的請求都將被 NSURLCache 處理。

NSURLCache類通過將NSURLRequest對象映射到NSCachedURLResponse對象來實現(xiàn)對URL加載請求的響應緩存。 它提供了一個復合內存和磁盤緩存,并允許您操縱內存和磁盤部分的大小。 您還可以控制緩存數(shù)據(jù)持久存儲的路徑。網(wǎng)絡緩存減少了需要向服務器發(fā)送請求的次數(shù),同時也提升了離線或在低速網(wǎng)絡中使用應用的體驗。當一個請求完成下載來自服務器的回應,一個緩存的回應將在本地保存。下一次同一個請求再發(fā)起時,本地保存的回應就會馬上返回,不需要連接服務器。NSURLCache 會 自動 且 透明 地返回回應。

NSURLCache和NSCachedURLResponse
參考:http://blog.csdn.net/wangyanchang21/article/details/51065555

  • NSHTTPCookie

在iOS中使用NSHTTPCookie類封裝一條cookie,通過NSHTTPCookie的方法讀取到cookie的通用屬性。

NSHTTPCookieStorage
NSHTTPCookieStorage單件類提供了管理所有NSHTTPCookie對象的接口,在OS X里,cookie是在所有程序中共享的,而在iOS中,cookie只當當前應用中有效。
通過sharedHTTPCookieStorage方法可獲取到共享的NSHTTPCookieStorage單件對象。

NSHTTPCookie 和NSHTTPCookieStorage
參考:http://blog.csdn.net/it520nm/article/details/38868491

  • NSURL

一個 NSURL 對象代表了一個表示遠程服務器資源或者本地文件的 URL。所以在 iOS 的網(wǎng)絡請求和操作文件系統(tǒng)的 API 中,很多都需要 NSURL 類型的參數(shù)。

參考:http://m.itdecent.cn/p/38f5f53dfbad

  • NSURLAuthenticationChallenge

NSURLAuthenticationChallenge封裝了服務器需要驗證客戶端的證書。

大多數(shù)應用程序本身不會創(chuàng)建驗證認證。但是,在添加對自定義網(wǎng)絡協(xié)議的支持時,您可能需要創(chuàng)建身份驗認證對象,作為自定義NSURLProtocol子類的一部分。
相反,您的應用在各種NSURLSession,NSURLConnection和NSURLDownload委托方法(如URLSession:task:didReceiveChallenge:completionHandler:)中接收到認證挑戰(zhàn)。這些對象提供了在決定如何處理服務器的身份驗證請求時所需的信息。該認證挑戰(zhàn)的核心是一個保護空間,它定義了被請求的認證類型,主機和端口號,網(wǎng)絡協(xié)議以及認證領域(在適用情況下)(一組相關服務器上的相關URL一套憑證)。您的應用通過提供NSURLCredential對象來應對認證認證。細節(jié)取決于您使用的API和認證的類型。在較高層次上,如果您向服務器或代理提供用戶的憑據(jù),RecommendationCredential方法將提供與NSURLCredentialStorage類中處理請求的保護空間中指定的條件相匹配的憑據(jù)(假設存在此憑據(jù)) 。如果previousFailureCount方法返回0并且提出的證書存在,則提議的證書尚未嘗試,這意味著您應該嘗試。如果它返回非零結果,那么服務器已經拒絕了使用的憑證,并且應該使用該憑證來填充密碼或證書選擇器對話框,然后提供新的憑證。您可以通過調用credentialWithUser:password:persistence:方法創(chuàng)建基于密碼的憑據(jù),或者使用credentialWithIdentity:certificates:persistence:創(chuàng)建基于證書的憑證。如果身份驗證的保護空間使用NSURLAuthenticationMethodServerTrust身份驗證方法,則請求會要求您驗證服務器的真實性。在這種情況下,recommendedCredential方法提供基于服務器作為其初始TLS握手的一部分提供的證書的憑證。大多數(shù)應用程序都應請求對基于服務器信任保護空間的身份驗證挑戰(zhàn)進行默認處理,但是如果您需要覆蓋默認的TLS驗證行為,則可以按照正確覆蓋TLS鏈驗證中所述進行操作。

參考:http://m.itdecent.cn/p/c1826245cf86

  • NSURLCache

NSURLCache 為應用的 URL 請求提供了內存以及磁盤上的綜合緩存機制,作為基礎類庫 URL 加載的一部分,任何通過 NSURLConnection 加載的請求都將被 NSURLCache 處理。將URL請求映射到緩存的響應對象的對象。
NSURLCache類通過將NSURLRequest對象映射到NSCachedURLResponse對象來實現(xiàn)對URL加載請求的響應緩存。 它提供了一個復合內存和磁盤緩存,并允許您操縱內存和磁盤部分的大小。 您還可以控制緩存數(shù)據(jù)持久存儲的路徑。

參考:http://m.itdecent.cn/p/227f8a5506fa

  • NSURLCounection (可用NSURLSession代替)

創(chuàng)一個NSURLCounection對象負責發(fā)送請求,建立客戶端和服務器的連接發(fā)送數(shù)據(jù)給服務器,使您可以啟動和停止URL請求。
NSURLConnection對象允許您通過提供URL請求對象來加載URL的內容。 NSURLConnection的接口是稀疏的,只提供控件來啟動和取消URL請求的異步加載。 您在URL請求對象本身上執(zhí)行大部分配置。

參考:http://m.itdecent.cn/p/e72622831747

  • NSURLCredential

身份驗證憑證,包含特定于憑證類型的身份驗證信息以及要使用的持久性存儲的類型(如果有)。web 服務可以在返回 http 響應時附帶認證要求 challenge,作用是詢問 http 請求的發(fā)起方是誰,這時發(fā)起方應提供正確的用戶名和密碼(即認證信息),然后 web 服務才會返回真正的 http 響應

URL加載系統(tǒng)支持三種類型的憑證:基于密碼的用戶憑證,基于證書的用戶憑證和基于證書的服務器憑證(用于驗證服務器的身份)。創(chuàng)建憑證時,可以指定將其用于單個請求,暫時保留(直到您的應用程序退出)或永久保存(在鑰匙串中)。

參考:http://blog.csdn.net/majiakun1/article/details/17013379

  • NSURLCredentialStorage

管理身份驗證憑證存儲的對象。網(wǎng)絡安全結合網(wǎng)絡請求使用

關于如何使用參考:http://m.itdecent.cn/p/668b263befc8

  • NSURLDownload

一個異步下載資源并將數(shù)據(jù)保存到文件的對象。

NSURLDownload的接口提供了初始化下載,設置目標路徑和取消加載請求的方法。
分配給此類的每個實例的委托對象應該實現(xiàn)由NSURLDownloadDelegate協(xié)議定義的方法。 這些方法為委托提供正在進行的異步下載的當前狀態(tài),并允許委托自定義URL加載過程。 這些委托方法在啟動相關NSURLDownload對象的異步加載操作的線程上調用。

  • NSURLProtectionSpace

來確認用戶訪問的是安全的服務器。從一個需要驗證的服務器請求資源,服務器或服務器上的區(qū)域,通常稱為領域,需要身份驗證。

保護空間定義了一系列匹配約束條件,用于確定應提供哪個憑證。 例如,如果請求為委托提供了請求客戶端用戶名和密碼的NSURLAuthenticationChallenge對象,則應用程序應為挑戰(zhàn)保護空間中指定的特定主機,端口,協(xié)議和領域提供正確的用戶名和密碼。

20140106092256187.jpeg

參考:http://blog.csdn.net/pingshw/article/details/17845735

  • NSURLProtocol

NSURLProtocol對象處理加載協(xié)議特定的URL數(shù)據(jù)。 NSURLProtocol類本身是一個抽象類,它提供了使用特定URL方案處理URL的基礎結構。而且必須使用該類的子類,并且需要被注冊。 您可以為您的應用支持的任何自定義協(xié)議或URL方案創(chuàng)建子類。

應用程序永遠不需要直接實例化一個NSURLProtocol子類。 當下載開始時,系統(tǒng)創(chuàng)建相應的協(xié)議對象來處理相應的URL請求。 您所要做的就是定義您的協(xié)議類,并在您的應用程序啟動時調用registerClass:class方法,以便系統(tǒng)知道您的協(xié)議。NSURLProtocol能夠讓你去重新定義蘋果的URL加載系統(tǒng) (URL Loading System)的行為,URL Loading System里有許多類用于處理URL請求,比如NSURL,NSURLRequest,NSURLConnection和NSURLSession等,當URL Loading System使用NSURLRequest去獲取資源的時候,它會創(chuàng)建一個NSURLProtocol子類的實例,你不應該直接實例化一個NSURLProtocol,NSURLProtocol看起來像是一個協(xié)議,但其實這是一個類,

參考:http://m.itdecent.cn/p/7c89b8c5482a

  • NSURLRequest

NSURLRequest 是一個獨立加載協(xié)議或URL方案的URL加載請求。
NSURLRequest封裝了加載請求的兩個基本數(shù)據(jù)元素:要加載的URL以及在實現(xiàn)時查詢URL內容緩存時使用的策略。

參考:https://www.cnblogs.com/HeiNeiKu/p/5628498.html

  • #NSMutableURLRequest

NSMutableURLRequest 是一個獨立于協(xié)議或URL方案的可變URL加載請求。
NSMutableURLRequest是NSURLRequest的一個子類,用于幫助開發(fā)人員發(fā)現(xiàn)為一系列URL加載請求改變一個請求對象,而不是為每個加載創(chuàng)建一個不可變的NSURLRequest對象。

使用參考:http://blog.csdn.net/codywangziham01/article/details/37691593

  • NSURLResponse

NSURLResponse類中存放請求的回執(zhí)信息,在發(fā)送網(wǎng)絡請求時,如果請求成功,首先會接收到服務端的回執(zhí)信息,直接開始接收具體的返回數(shù)據(jù)。
相關的NSHTTPURLResponse類是NSURLResponse的一個常用子類,其對象表示對HTTP URL加載請求的響應,并存儲附加的協(xié)議特定信息(如響應頭)。 每當你發(fā)出HTTP請求時,你得到的NSURLResponse對象實際上就是NSHTTPURLResponse類的一個實例。

參考:https://yq.aliyun.com/articles/39442

  • NSHTTPURLResponse

NSHTTPURLResponse類是NSURLResponse的一個子類,它提供了訪問特定于HTTP協(xié)議響應的信息的方法。 無論何時發(fā)出HTTP URL加載請求,從NSURLSession,NSURLConnection或NSURLDownload類獲得的任何響應對象都是NSHTTPURLResponse類的實例。

//獲得當前要下載文件的總大?。ㄍㄟ^響應頭得到)
 NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

我是從網(wǎng)絡解析中理解該類的使用方法和作用
參考:http://m.itdecent.cn/p/7f6c0480bb94

進程間通信----interprocess Communication

  • NSPipe

相關流程之間的單向溝通渠道。
NSPipe對象提供了一個面向對象的接口來訪問管道。 NSPipe對象表示管道的兩端,并通過管道進行通信。 管道是相關過程之間的單向溝通渠道; 一個進程寫入數(shù)據(jù),另一個進程讀取數(shù)據(jù)。 通過管道的數(shù)據(jù)被緩沖; 緩沖區(qū)的大小由底層操作系統(tǒng)決定。 NSPipe是一個抽象類,是一個類集群的公共接口。

  • NSPort

NSPort通信渠道的抽象類。

通信發(fā)生在NSPort對象之間,通常駐留在不同的線程或任務中。分布式對象系統(tǒng)使用NSPort對象來回發(fā)送NSPortMessage對象。盡可能使用分布式對象實現(xiàn)應用程序間通信,并僅在必要時使用NSPort對象。要接收傳入消息,必須將NSPort對象作為輸入源添加到NSRunLoop對象。 NSConnection對象在初始化時自動添加它們的接收端口。當一個NSPort對象接收到一個端口消息時,它將消息轉發(fā)給它的委托在一個handleMachMessage:或者handlePortMessage:消息中。委托人只能實現(xiàn)其中一種方法來處理任何形式的傳入消息。 handleMachMessage:以msg_header_t結構開始的消息作為原始的Mach消息。 handlePortMessage:提供消息作為NSPortMessage對象,它是Mach消息的面向對象的包裝器。如果委托沒有被設置,NSPort對象處理消息本身。當您完成使用端口對象時,必須在發(fā)送釋放消息之前明確地使端口對象無效。同樣,如果您的應用程序使用垃圾回收,則必須在刪除對其的強引用之前使端口對象無效。如果您沒有使端口無效,則生成的端口對象可能會留存并造成內存泄漏。要使端口對象無效,請調用其無效方法?;径x了NSPort的三個具體子類。 NSMachPort和NSMessagePort只允許本地(在同一臺機器上)通信。 NSSocketPort允許本地和遠程通信,但是對于本地情況,可能比其他的更昂貴。使用allocWithZone:或port創(chuàng)建NSPort對象時,會創(chuàng)建一個NSMachPort對象。

  • NSMachPort

NSMachPort是NSPort的一個子類,包含一個Mach端口,它是macOS中的基本通信端口。 NSMachPort只允許本地(在同一臺機器上)通信。 伴隨類NSSocketPort允許本地和遠程分布式對象通信,但在本地情況下可能比NSMachPort更消耗資源。要有效地使用NSMachPort,您應該熟悉Mach端口,端口訪問權限和Mach消息。

使用參考:http://blog.csdn.net/yxh265/article/details/51483822

  • NSMessagePort

用于在連接之間傳輸對象代理(有時是對象本身)的編碼器。一個NSPortCoder實例是被一個NSConnection對象創(chuàng)建和使用,永遠不需要直接自己創(chuàng)建或使用一個。
NSPortCoder是分布式對象系統(tǒng)中NSCoder的一個具體子類,用于在NSConnection對象之間傳輸對象代理(有時是對象本身)。 ;

關于線程間的通信
感謝作者翻譯順便膜拜一下大神:http://m.itdecent.cn/p/c0893c93f2cb

線程鎖和線程----Locking Threading

  • NSConditionLock

條件鎖,一個線程獲得了鎖,其它線程等待。
使用一個NSConditionLock對象,可以確保一個線程只有在滿足某個條件時才能獲得一個鎖。 一旦獲得了鎖并執(zhí)行了代碼的關鍵部分,線程就可以放棄鎖并將相關條件設置為新的東西。 條件本身是任意的:你根據(jù)需要為你的應用程序定義它們。

理解參考:http://blog.csdn.net/mandmg/article/details/52280067
參考用法:http://blog.csdn.net/growinggiant/article/details/50717974

  • NSDistributedLock

NSDistributedLock是MAC開發(fā)中的跨進程的分布式鎖,底層是用文件系統(tǒng)實現(xiàn)的互斥鎖。NSDistributedLock沒有實現(xiàn)NSLocking協(xié)議,所以沒有l(wèi)ock方法,取而代之的是非阻塞的tryLock方法。
鎖由文件系統(tǒng)中的條目(如文件或目錄)實現(xiàn)。 對于多個應用程序使用NSDistributedLock對象來協(xié)調其活動,該鎖定必須在可以運行應用程序的所有主機可訪問的文件系統(tǒng)上寫入。
使用tryLock方法嘗試獲取一個鎖。 您通常應該使用解鎖方法來釋放鎖而不是breakLock。
NSDistributedLock不符合NSLocking協(xié)議,也沒有鎖定方法。 該協(xié)議的鎖定方法旨在阻止線程的執(zhí)行,直到成功。 對于NSDistributedLock對象,這可能意味著以某個預定的速率輪詢文件系統(tǒng)。 更好的解決方案是提供tryLock方法,并讓您確定對您的應用程序有意義的輪詢頻率。

  • NSLock

NSLock鎖 ,協(xié)調同一應用程序中多個執(zhí)行線程的操作的對象。不能用于實現(xiàn)遞歸鎖

NSLock對象可用于調解對應用程序全局數(shù)據(jù)的訪問,或保護代碼的關鍵部分,使其能夠以原子方式運行。

注意:NSLock類使用POSIX線程來實現(xiàn)其鎖定行為。 將解鎖消息發(fā)送給NSLock對象時,必須確保該消息是從發(fā)送初始鎖定消息的同一個線程發(fā)送的。 解鎖來自不同線程的鎖可能會導致未定義的行為。

你不應該使用這個類來實現(xiàn)一個遞歸鎖。 在同一個線程上調用兩次鎖定方法會永久鎖定線程。 使用NSRecursiveLock類來實現(xiàn)遞歸鎖。
解鎖未鎖定的鎖被視為程序員錯誤,應在代碼中修復。 NSLock類通過向控制臺發(fā)送錯誤消息來報告這些錯誤。

關于鎖
總結的很六忍不住點個贊的參考:http://m.itdecent.cn/p/35dd92bcfe8c

  • NSOperation

iOS平臺提供更高級的并發(fā)(異步)調用接口,讓你可以集中精力去設計需完成的任務代碼,避免去寫與程序邏輯無關的線程生成、運行等管理代碼。當然實質上是這些接口隱含生成線程和管理線程的運行,從而更加簡潔地實現(xiàn)多線程
理解參考:http://blog.csdn.net/bravegogo/article/details/51155906
使用參考:http://m.itdecent.cn/p/0c241a4918bf

  • NSBlockOperation

NSBlockOperation用于管理一個或多個塊的并發(fā)執(zhí)行的操作。
NSBlockOperation類是NSOperation的一個具體子類,它管理一個或多個塊的并發(fā)執(zhí)行。 您可以使用此對象一次執(zhí)行多個塊,而無需為每個塊創(chuàng)建單獨的操作對象。 當執(zhí)行多個塊時,操作本身只有在所有塊完成執(zhí)行后才被認為是完成的。
添加到塊操作的塊將以默認優(yōu)先級調度到適當?shù)墓ぷ麝犃小?塊本身不應該對其執(zhí)行環(huán)境的配置做任何假設。

  • NSInvocationOperation

NSInvocationOperation用于管理指定為調用的單個封裝任務的執(zhí)行的操作。
NSInvocationOperation類是NSOperation的具體子類,用于啟動一個操作,該操作包括調用指定對象上的選擇器。 這個類實現(xiàn)了非并發(fā)操作。

NSBlockOperation和NSInvocationOperation
參考 :http://blog.csdn.net/crycheng/article/details/21799611

  • NSOperationQueue

NSOperationQueue用于調節(jié)一組操作的執(zhí)行的NSOperation加入到一個NSOperationQueue中去異步執(zhí)行隊列。
在被添加到操作隊列之后,NSOperation實例將保留在該隊列中,直到被明確取消或完成其任務。隊列中的操作(但尚未執(zhí)行)本身按照優(yōu)先級和操作間對象依賴關系進行組織,并相應執(zhí)行。應用程序可能會創(chuàng)建多個操作隊列并將操作提交給其中的任何一個。
即使這些操作位于不同的操作隊列中,操作間依賴也為操作提供絕對的執(zhí)行順序。操作對象不被視為準備好執(zhí)行,直到所有依賴操作完成執(zhí)行。對于準備執(zhí)行的操作,操作隊列總是執(zhí)行相對于其他就緒操作具有最高優(yōu)先級的操作隊列。有關如何設置優(yōu)先級別和依賴關系的詳細信息
添加后,不能直接從隊列中刪除操作。操作保持在其隊列中,直到它報告完成其任務。完成任務并不一定意味著操作完成任務。操作也可以取消。取消操作對象會將隊列中的對象留在隊列中,但會通知對象盡快中止其任務。對于當前正在執(zhí)行的操作,這意味著操作對象的工作代碼必須檢查取消狀態(tài),停止正在執(zhí)行的操作,并將自己標記為已完成。對于已排隊但尚未執(zhí)行的操作,隊列仍必須調用操作對象的start方法,以便它可以處理取消事件并將其標記為已完成。

參考:https://www.cnblogs.com/sfce/p/4329045.html

  • NSRecursiveLock

NSRecursiveLock實際上定義的是一個遞歸鎖,這個鎖可以被同一線程多次請求,而不會引起死鎖。這主要是用在循環(huán)或遞歸操作中。

參考:http://www.cocoachina.com/ios/20150513/11808.html

  • NSTask (貌似多用于Mac OS編程)

NSTask創(chuàng)建的是一個獨立運行的進程,不會與主程序共享存儲空間
使用NSTask類,您的程序可以將另一個程序作為子進程運行,并可以監(jiān)視該程序的執(zhí)行。 NSTask對象創(chuàng)建一個單獨的可執(zhí)行實體; 它與NSThread的區(qū)別在于它不會與創(chuàng)建它的進程共享內存空間。
進程在由當前值定義的幾個項目的環(huán)境中運行:當前目錄,標準輸入,標準輸出,標準錯誤以及任何環(huán)境變量的值。 默認情況下,NSTask對象從啟動它的進程繼承它的環(huán)境。 如果在過程中有任何值應該不同,例如,如果當前目錄應該更改,則在啟動它之前必須更改該值。 進程的環(huán)境在運行時不能改變。
一個NSTask對象只能運行一次。

注意:在沙盒應用程序中,使用NSTask類創(chuàng)建的子進程將繼承父應用程序的沙箱。 您通常應該將幫助器應用程序編寫為XPC Services,因為XPC Services允許您為幫助器應用程序指定不同的沙盒權利。

通過NSTask用Cocoa執(zhí)行perl腳本使用:http://www.cocoachina.com/ios/20090611/97.html

  • NSThread

常用線程之一
當你想讓Objective-C方法在自己的執(zhí)行線程中運行時,使用這個類。 當需要執(zhí)行冗長的任務時,線程特別有用,但不希望它阻塞應用程序其余部分的執(zhí)行。 特別是,您可以使用線程來避免阻塞應用程序的主線程,主線程處理用戶界面和與事件相關的操作。 線程也可以用來把一個大的工作分成幾個較小的工作,這可能會導致多核計算機的性能提高。
NSThread類支持類似于NSOperation的語義來監(jiān)視線程的運行時狀態(tài)。 您可以使用這些語義來取消線程的執(zhí)行或確定線程是否仍在執(zhí)行或已經完成其任務。 取消線程需要來自線程代碼的支持;

參考:http://m.itdecent.cn/p/0d4812426f72

通知---- Notifications

  • NSNotification

過通知中心向所有注冊觀察員廣播的信息容器。
NSNotification對象(稱為通知)包含名稱,對象和可選字典。該名稱是標識通知的標簽。該對象是通知的發(fā)布者想要發(fā)送給該通知的觀察者的任何對象(通常是發(fā)布通知的對象)。字典存儲其他相關的對象,如果有的話。 NSNotification對象是不可變的對象。

參考:http://m.itdecent.cn/p/a2cb99dcd4fe

  • NSNotificationCenter

通知中心是整個通知機制的關鍵所在,它管理著監(jiān)聽者的注冊和注銷,通知的發(fā)送和接收。通知中心維護著一個通知的分發(fā)表,把所有通知發(fā)送者發(fā)送的通知,轉發(fā)給對應的監(jiān)聽者們通知調度機制,可以向登記的觀察員廣播信息。
對象向通知中心注冊,以使用addObserver:selector:name:object:或addObserverForName:object:queue:usingBlock:methods來接收通知(NSNotification對象)。 當一個對象自己添加為觀察者時,它指定應該接收哪些通知。 因此一個對象可能會多次調用這個方法,以便注冊自己作為幾個不同通知的觀察者。
每個正在運行的應用程序都有一個defaultCenter通知中心,您可以創(chuàng)建新的通知中心來組織特定情況下的通信。
通知中心只能在單個程序中發(fā)送通知; 如果要將通知發(fā)布到其他進程或從其他進程接收通知,請改為使用NSDistributedNotificationCenter。

參考:http://m.itdecent.cn/p/a2cb99dcd4fe

  • NSDistributedNotificationCenter(mas OS上才有)

每個任務都有一個缺省的分布式通告中心,您可以通過NSDistributedNotificationCenter的defaultCenter類方法來訪問。這個分布式通告中心負責處理同一個機器的不通任務之間的通告。如果需要實現(xiàn)不同機器上的任務間通訊,請使用分布式對象。

參考:http://www.cnblogs.com/yongbufangqi1988/p/7224505.html

  • NSNotificationQueue

鑒于通知中心在發(fā)布通知時分發(fā)通知,放入隊列的通知可以被延遲,直到當前通過運行循環(huán)結束或者直到運行循環(huán)空閑。 重復的通知可以合并,以便只發(fā)送一個通知,盡管發(fā)布了多個通知。
通知隊列以先進先出(FIFO)順序維護通知。 當通知移動到隊列的前面時,隊列會將其發(fā)送到通知中心,通知中心會將通知分派給注冊為觀察者的所有對象。
每個線程都有一個默認通知隊列,該通知隊列與進程的默認通知中心相關聯(lián)。 您可以創(chuàng)建自己的通知隊列,并且每個中心和線程都有多個隊列。

創(chuàng)建一個NSNotificationQueue隊列(first in-first out),將定義的NSNotification放入其中,并為其指定三種狀態(tài)之一:
typedef NS_ENUM(NSUInteger, NSPostingStyle) {
    NSPostWhenIdle = 1,      // 當runloop處于空閑狀態(tài)時post
    NSPostASAP = 2,    // 當當前runloop完成之后立即post
    NSPostNow = 3    // 立即post,同步(為什么需要這種type,且看三.3)
};
這樣,將NSNotification放入queue,然后根據(jù)其type,NSNotificationQueue在合適的時機將其post到NSNotificationCenter。這樣就完成了異步的需求。

通知概括的很全面:http://www.cocoachina.com/ios/20170426/19124.html

Objective-C語言服務---- Objective-c language Srevices

  • NSCoder

NSCoder數(shù)據(jù)儲存作為對象的基礎的抽象類,使其他對象能夠存檔和分發(fā)
NSCoder抽象類聲明具體子類使用的接口在內存和其他格式之間傳輸對象和其他值。此功能為存檔(對象和數(shù)據(jù)項存儲在磁盤上)和分配(在不同進程或線程之間復制對象和數(shù)據(jù)項)提供了基礎。由Foundation提供的具體子類是NSArchiver,NSUnarchiver,NSKeyedArchiver,NSKeyedUnarchiver和NSPortCoder。一般將NSCoder的具體子類稱為編碼器類,將這些類的實例稱為編碼器對象(或簡稱為編碼器)。只能對值進行編碼的編碼器對象被稱為編碼器對象,并且只能將值解碼為解碼器對象。
NSCoder以對象,標量,C數(shù)組,結構和字符串以及指向這些類型的指針進行操作。它不處理實現(xiàn)在不同平臺間變化的類型,例如union,void *,函數(shù)指針和長鏈指針。編碼器對象將對象類型信息與數(shù)據(jù)一起存儲,因此從字節(jié)流解碼的對象通常與最初編碼到流中的對象具有相同的類。然而,一個對象在編碼時可以改變它的類。這在檔案和序列編程指南中有描述。
AV Foundation框架將方法添加到NSCoder類中,以便于創(chuàng)建包括Core Media時間結構在內的存檔,并從存檔中提取Core Media時間結構

參考:https://www.cnblogs.com/xiaofeixiang/p/4266156.html

  • NSArchiver

將對象的數(shù)據(jù)存儲到存檔的編碼器。
NSArchiver是NSCoder的一個具體子類,它提供了一種將對象編碼成可存儲在文件中的與體系結構無關的格式。 歸檔對象圖時,每個對象的類信息和實例變量都會寫入歸檔。 伴隨類NSUnarchiver對檔案中的數(shù)據(jù)進行解碼,并創(chuàng)建與原始組等價的對象圖。
NSArchiver將歸檔數(shù)據(jù)存儲在可變數(shù)據(jù)對象(NSMutableData)中。 在對對象進行編碼之后,可以讓NSArchiver對象立即將此可變數(shù)據(jù)對象寫入文件,或者可以檢索可變數(shù)據(jù)對象以供其他用途。

  • NSKeyedArchiver

將對象的數(shù)據(jù)存儲到一鍵值對引用的存檔的編碼器。NSKeyedArchiver是NSCoder的一個具體子類,它提供了一種將對象(和標量值)編碼成可存儲在文件中的與體系結構無關的格式。歸檔一組對象時,每個對象的類信息和實例變量都寫入歸檔。伴隨類NSKeyedUnarchiver解碼檔案中的數(shù)據(jù),并創(chuàng)建一組等同于原始組的對象。
鍵控存檔與非鍵控存檔的不同之處在于,編碼到存檔中的所有對象和值都被賦予名稱或鍵。解碼非鍵控壓縮文件時,必須按照與編碼相同的順序對值進行解碼。當解碼一個鍵控存檔時,由于數(shù)值是按名稱來請求的,所以數(shù)值可以不按順序解碼,也可以根本不解碼。因此,密鑰存檔為前向和后向兼容提供了更好的支持。
賦予編碼值的鍵只能在當前編碼對象的范圍內唯一。鍵控存檔是分層的,因此對象A用于編碼其實例變量的鍵不會與對象B使用的鍵沖突,即使A和B是同一類的實例。但是,在一個對象中,子類使用的鍵可能與其超類中使用的鍵相沖突
將各種類型的對象存儲到文件中,而不僅僅是字符串、數(shù)組和字典類型,有一種更靈活的方法。就是利用NSKeyedAarchiver類創(chuàng)建帶鍵(keyed)的檔案來完成。
Mac OS X從版本10.2開始支持帶鍵的檔案。在此之前,要使用NSArchiver類創(chuàng)建連續(xù)的(sequential)歸檔。連續(xù)的歸檔需要完全按照寫入時的順序讀取歸檔中的數(shù)據(jù)。
在帶鍵的歸檔中,每個歸檔字段都有一個名稱。歸檔某個對象時,會為它提供一個名稱,即鍵。從歸檔中檢索該對象時,是根據(jù)這個鍵來檢索的。這樣可以按照任意的順序將對象寫入歸檔并進行檢索。另外,如果向類添加了新的實例變量或刪除了實例變量,程序也可以進行處理。

  • NSKeyedUnarchiver

NSKeyedUnarchiver是一個解碼器,用于從鍵值引用的存檔中恢復數(shù)據(jù)。

NSKeyedUnarchiver是NSCoder的一個具體子類,定義了從一個鍵入的存檔解碼一組命名對象(和標量值)的方法。這樣的檔案由NSKeyedArchiver類的實例產生。
鍵控歸檔被編碼為對象的層次結構。層次結構中的每個對象都作為其他對象編碼的名稱空間??捎糜诮獯a的對象僅限于在特定對象的直接范圍內編碼的對象。在層次結構的其他地方編碼的對象,不論是高于,低于還是與此特定對象平行,都是不可訪問的。通過這種方式,特定對象用于編碼其實例變量的鍵只需在該對象的范圍內是唯一的。
如果使用歸檔中不存在的鍵調用此類的其中一個decode ...方法,則返回非正值。該值因解碼類型而異。例如,如果存檔中不存在密鑰,則decodeBoolForKey:返回NO,decodeIntForKey:返回0,decodeObjectForKey:返回nil。
NSKeyedUnarchiver支持有限類型的強制。編碼為任何類型的整數(shù)的值,無論是標準的int還是明確的32位或64位整數(shù),都可以使用任何整數(shù)解碼方法來解碼。同樣,編碼為float或double的值可以解碼為float或double值。如果編碼值太大而不能適應強制類型,則解碼方法將拋出NSRangeException。此外,當試圖強制一個不兼容類型的值時,例如將一個int解碼為一個float,解碼方法將拋出一個NSInvalidUnarchiveOperationException異常。

NSKeyedArchiver 和NSKeyedUnarchiver
參考:http://m.itdecent.cn/p/6ad8447ce8ac

  • NSUnarchiver

NSUnarchiver類可以通過解碼歸檔文件獲得對象。從檔案中恢復數(shù)據(jù)的解碼器。
NSUnarchiver是NSCoder的一個具體子類,定義了從一個存檔解碼一組Objective-C對象的方法。 這樣的檔案由NSArchiver類的對象產生。

NSArchiver類和NSUnarchiver
參考:http://blog.csdn.net/sps900608/article/details/51898671

  • NSPropertyListSerialization

NSPropertyListSerialization這個類提供了一些方法,專門用來轉換不同組織形式的list對象.list對象包括了NSData, NSString, NSArray, NSDictionary, NSDate, 以及 NSNumber.

參考:https://www.cnblogs.com/YouXianMing/p/3642282.html

  • NSAssertionHandler

NSAssertionHandler實例是自動創(chuàng)建的,用于處理錯誤斷言。斷言宏,比如NSAssert和NSCAssert,用于評估一個條件,如果條件評估為錯誤,這個宏向NSAssertionHandler實例發(fā)送一個表示錯誤的字符串。每個線程都有它自己的NSAssertionHandler實例。斷言處理程序調用的時候,會打印一條錯誤信息,包含斷言的方法或類,并拋出一個NSInternalInconsistencyException。

參考:http://blog.csdn.net/baitongzbt/article/details/39833935

  • NSAutoreleasePool

自動釋放池 :當您向一個對象發(fā)送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當?shù)膶ο?,因此自動釋放?定義的作用域內的其它對象可以向它發(fā)送消息。當程序執(zhí)行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放

參考:http://blog.csdn.net/tongseng/article/details/52101476

  • NSClassDescription

NSClassDescription用于查詢類的關系和屬性的接口的抽象類。
NSClassDescription的具體子類提供了特定類的對象的可用屬性以及該類與其他類之間的關系。定義類之間的這些關系允許使用鍵值編碼更智能和靈活地處理對象。
需要注意的是,默認情況下沒有類描述。要在你的代碼中使用NSClassDescription對象,你必須為你的模型類實現(xiàn)它們。對于所有具體的子類,您必須為NSClassDescription的所有實例方法提供實現(xiàn)。 (NSClassDescription只提供維護已注冊類描述緩存的類方法的實現(xiàn)。)創(chuàng)建后,必須使用NSClassDescription方法registerClassDescription:forClass:注冊類描述。
您可以在由諸如attributeKeys和toManyRelationshipKeys等方法返回的數(shù)組中使用NSString對象來訪問(使用鍵值編碼)類描述對象所對應類的實例的屬性。有關屬性和關系的更多信息,請參閱Cocoa基礎知識指南。有關鍵值編碼的更多信息,請參閱鍵值編碼編程指南。
用于映射可編寫腳本類之間關系的NSScriptClassDescription是作為Cocoa框架的一部分提供的NSClassDescription的唯一具體子類。

  • NSException

控制臺輸出的日志信息就是NSException產生的,一旦程序拋出異常,程序就會崩潰,控制臺就會有這些崩潰日志。

最熟悉的陌生類 強大的令人窒息 感謝作者讓我知道了這個家伙
參考:http://m.itdecent.cn/p/05aad21e319e

  • NSLnvocation

在消息轉發(fā)中提到過NSInvocation這個類,這里說一下我所理解的NSInvocation。NSInvocation 是命令模式的一種實現(xiàn),它包含選擇器、方法簽名、相應的參數(shù)以及目標對象。所謂的方法簽名,即方法所對應的返回值類型和參數(shù)類型。當NSInvocation被調用,它會在運行時通過目標對象去尋找對應的方法,從而確保唯一性,可以用[receiver message]來解釋。實際開發(fā)過程中直接創(chuàng)建NSInvocation的情況不多見,這些事情通常交給系統(tǒng)來做

很六的類
參考:http://m.itdecent.cn/p/05aad21e319e

  • NSMethodSignature

NSMethodSignature顧名思義應該就是“方法簽名”,類似于C++中的編譯器時的函數(shù)簽名。
官方定義該類為對方法的參數(shù)、返回類似進行封裝,協(xié)同NSInvocation實現(xiàn)消息轉發(fā)。

參考:http://blog.csdn.net/dean19900504/article/details/8737862

  • NSUndoManager

NSUndoManager允許記錄用戶執(zhí)行的操作并且反轉這類操作。

當你調用一個可以改變一些東西的方法或者是執(zhí)行一個改變屬性值的動作(例如 setter 方法)時,你可以注冊這個操作來進行撤銷。

一個撤銷操作包含了接收消息的對象,發(fā)送消息以及參數(shù) - 通常你會傳入原始值。

NSUndoManager實例支持重做操作,所以才能逆轉操作。你可以認為這個管理器擁有兩個棧。實際上,它管理兩個棧,undo(撤銷)棧和redo(重做)棧 - 對應NSUndoManager的私有屬性_undoStack和_redoStack,里面存儲著一些操作。

媽媽再也不擔心我弄錯東西了
參考:http://m.itdecent.cn/p/df572c44a82c

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容