接iOS Foundation 框架简介(上)的内继续介绍Foundation框架内容
站在前辈的肩膀上前行
UIKit框架和Foundation框架
所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象都是NSObject,NSObject就处在Foundation框架之中
简书
Foundation框架大致内容
网络请求类---URL
-
NSCachedURLResponse
NSCachedURLResponse 是个包含 NSURLResponse 以及它对应的缓存中的 NSData 的类,对URL请求的缓存响应。
NSCachedURLResponse对象以NSURLResponse对象的形式提供服务器的响应元数据,以及包含实际缓存的内容数据的NSData对象。 它的存储策略决定了响应是应该缓存在磁盘,内存中还是根本不缓存。缓存的响应还包含用户信息字典,您可以在其中存储有关缓存项目的特定于应用程序的信息。
NSURLCache类存储和检索NSCachedURLResponse的实例。
-
NSURLCache
NSURLCache 为您的应用的 URL 请求提供了内存中以及磁盘上的综合缓存机制。将URL请求映射到缓存的响应对象的对象。 作为基础类库 URL 加载系统 的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。
NSURLCache类通过将NSURLRequest对象映射到NSCachedURLResponse对象来实现对URL加载请求的响应缓存。 它提供了一个复合内存和磁盘缓存,并允许您操纵内存和磁盘部分的大小。 您还可以控制缓存数据持久存储的路径。网络缓存减少了需要向服务器发送请求的次数,同时也提升了离线或在低速网络中使用应用的体验。当一个请求完成下载来自服务器的回应,一个缓存的回应将在本地保存。下一次同一个请求再发起时,本地保存的回应就会马上返回,不需要连接服务器。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 的网络请求和操作文件系统的 API 中,很多都需要 NSURL 类型的参数。
参考:http://www.jianshu.com/p/38f5f53dfbad
-
NSURLAuthenticationChallenge
NSURLAuthenticationChallenge封装了服务器需要验证客户端的证书。
大多数应用程序本身不会创建验证认证。但是,在添加对自定义网络协议的支持时,您可能需要创建身份验认证对象,作为自定义NSURLProtocol子类的一部分。
相反,您的应用在各种NSURLSession,NSURLConnection和NSURLDownload委托方法(如URLSession:task:didReceiveChallenge:completionHandler:)中接收到认证挑战。这些对象提供了在决定如何处理服务器的身份验证请求时所需的信息。该认证挑战的核心是一个保护空间,它定义了被请求的认证类型,主机和端口号,网络协议以及认证领域(在适用情况下)(一组相关服务器上的相关URL一套凭证)。您的应用通过提供NSURLCredential对象来应对认证认证。细节取决于您使用的API和认证的类型。在较高层次上,如果您向服务器或代理提供用户的凭据,RecommendationCredential方法将提供与NSURLCredentialStorage类中处理请求的保护空间中指定的条件相匹配的凭据(假设存在此凭据) 。如果previousFailureCount方法返回0并且提出的证书存在,则提议的证书尚未尝试,这意味着您应该尝试。如果它返回非零结果,那么服务器已经拒绝了使用的凭证,并且应该使用该凭证来填充密码或证书选择器对话框,然后提供新的凭证。您可以通过调用credentialWithUser:password:persistence:方法创建基于密码的凭据,或者使用credentialWithIdentity:certificates:persistence:创建基于证书的凭证。如果身份验证的保护空间使用NSURLAuthenticationMethodServerTrust身份验证方法,则请求会要求您验证服务器的真实性。在这种情况下,recommendedCredential方法提供基于服务器作为其初始TLS握手的一部分提供的证书的凭证。大多数应用程序都应请求对基于服务器信任保护空间的身份验证挑战进行默认处理,但是如果您需要覆盖默认的TLS验证行为,则可以按照正确覆盖TLS链验证中所述进行操作。
参考:http://www.jianshu.com/p/c1826245cf86
-
NSURLCache
NSURLCache 为应用的 URL 请求提供了内存以及磁盘上的综合缓存机制,作为基础类库 URL 加载的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。将URL请求映射到缓存的响应对象的对象。
NSURLCache类通过将NSURLRequest对象映射到NSCachedURLResponse对象来实现对URL加载请求的响应缓存。 它提供了一个复合内存和磁盘缓存,并允许您操纵内存和磁盘部分的大小。 您还可以控制缓存数据持久存储的路径。
参考:http://www.jianshu.com/p/227f8a5506fa
-
NSURLCounection (可用NSURLSession代替)
创一个NSURLCounection对象负责发送请求,建立客户端和服务器的连接发送数据给服务器,使您可以启动和停止URL请求。
NSURLConnection对象允许您通过提供URL请求对象来加载URL的内容。 NSURLConnection的接口是稀疏的,只提供控件来启动和取消URL请求的异步加载。 您在URL请求对象本身上执行大部分配置。
参考:http://www.jianshu.com/p/e72622831747
-
NSURLCredential
身份验证凭证,包含特定于凭证类型的身份验证信息以及要使用的持久性存储的类型(如果有)。web 服务可以在返回 http 响应时附带认证要求 challenge,作用是询问 http 请求的发起方是谁,这时发起方应提供正确的用户名和密码(即认证信息),然后 web 服务才会返回真正的 http 响应
URL加载系统支持三种类型的凭证:基于密码的用户凭证,基于证书的用户凭证和基于证书的服务器凭证(用于验证服务器的身份)。创建凭证时,可以指定将其用于单个请求,暂时保留(直到您的应用程序退出)或永久保存(在钥匙串中)。
参考:http://blog.csdn.net/majiakun1/article/details/17013379
-
NSURLCredentialStorage
管理身份验证凭证存储的对象。网络安全结合网络请求使用
关于如何使用参考:http://www.jianshu.com/p/668b263befc8
-
NSURLDownload
一个异步下载资源并将数据保存到文件的对象。
NSURLDownload的接口提供了初始化下载,设置目标路径和取消加载请求的方法。
分配给此类的每个实例的委托对象应该实现由NSURLDownloadDelegate协议定义的方法。 这些方法为委托提供正在进行的异步下载的当前状态,并允许委托自定义URL加载过程。 这些委托方法在启动相关NSURLDownload对象的异步加载操作的线程上调用。
-
NSURLProtectionSpace
来确认用户访问的是安全的服务器。从一个需要验证的服务器请求资源,服务器或服务器上的区域,通常称为领域,需要身份验证。
保护空间定义了一系列匹配约束条件,用于确定应提供哪个凭证。 例如,如果请求为委托提供了请求客户端用户名和密码的NSURLAuthenticationChallenge对象,则应用程序应为挑战保护空间中指定的特定主机,端口,协议和领域提供正确的用户名和密码。
参考:http://blog.csdn.net/pingshw/article/details/17845735
-
NSURLProtocol
NSURLProtocol对象处理加载协议特定的URL数据。 NSURLProtocol类本身是一个抽象类,它提供了使用特定URL方案处理URL的基础结构。而且必须使用该类的子类,并且需要被注册。 您可以为您的应用支持的任何自定义协议或URL方案创建子类。
应用程序永远不需要直接实例化一个NSURLProtocol子类。 当下载开始时,系统创建相应的协议对象来处理相应的URL请求。 您所要做的就是定义您的协议类,并在您的应用程序启动时调用registerClass:class方法,以便系统知道您的协议。NSURLProtocol能够让你去重新定义苹果的URL加载系统 (URL Loading System)的行为,URL Loading System里有许多类用于处理URL请求,比如NSURL,NSURLRequest,NSURLConnection和NSURLSession等,当URL Loading System使用NSURLRequest去获取资源的时候,它会创建一个NSURLProtocol子类的实例,你不应该直接实例化一个NSURLProtocol,NSURLProtocol看起来像是一个协议,但其实这是一个类,
参考:http://www.jianshu.com/p/7c89b8c5482a
-
NSURLRequest
NSURLRequest 是一个独立加载协议或URL方案的URL加载请求。
NSURLRequest封装了加载请求的两个基本数据元素:要加载的URL以及在实现时查询URL内容缓存时使用的策略。
参考:https://www.cnblogs.com/HeiNeiKu/p/5628498.html
-
#NSMutableURLRequest
NSMutableURLRequest 是一个独立于协议或URL方案的可变URL加载请求。
NSMutableURLRequest是NSURLRequest的一个子类,用于帮助开发人员发现为一系列URL加载请求改变一个请求对象,而不是为每个加载创建一个不可变的NSURLRequest对象。
使用参考:http://blog.csdn.net/codywangziham01/article/details/37691593
-
NSURLResponse
NSURLResponse类中存放请求的回执信息,在发送网络请求时,如果请求成功,首先会接收到服务端的回执信息,直接开始接收具体的返回数据。
相关的NSHTTPURLResponse类是NSURLResponse的一个常用子类,其对象表示对HTTP URL加载请求的响应,并存储附加的协议特定信息(如响应头)。 每当你发出HTTP请求时,你得到的NSURLResponse对象实际上就是NSHTTPURLResponse类的一个实例。
参考:https://yq.aliyun.com/articles/39442
-
NSHTTPURLResponse
NSHTTPURLResponse类是NSURLResponse的一个子类,它提供了访问特定于HTTP协议响应的信息的方法。 无论何时发出HTTP URL加载请求,从NSURLSession,NSURLConnection或NSURLDownload类获得的任何响应对象都是NSHTTPURLResponse类的实例。
//获得当前要下载文件的总大小(通过响应头得到)
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
我是从网络解析中理解该类的使用方法和作用
参考:http://www.jianshu.com/p/7f6c0480bb94
进程间通信----interprocess Communication
-
NSPipe
相关流程之间的单向沟通渠道。
NSPipe对象提供了一个面向对象的接口来访问管道。 NSPipe对象表示管道的两端,并通过管道进行通信。 管道是相关过程之间的单向沟通渠道; 一个进程写入数据,另一个进程读取数据。 通过管道的数据被缓冲; 缓冲区的大小由底层操作系统决定。 NSPipe是一个抽象类,是一个类集群的公共接口。
-
NSPort
NSPort通信渠道的抽象类。
通信发生在NSPort对象之间,通常驻留在不同的线程或任务中。分布式对象系统使用NSPort对象来回发送NSPortMessage对象。尽可能使用分布式对象实现应用程序间通信,并仅在必要时使用NSPort对象。要接收传入消息,必须将NSPort对象作为输入源添加到NSRunLoop对象。 NSConnection对象在初始化时自动添加它们的接收端口。当一个NSPort对象接收到一个端口消息时,它将消息转发给它的委托在一个handleMachMessage:或者handlePortMessage:消息中。委托人只能实现其中一种方法来处理任何形式的传入消息。 handleMachMessage:以msg_header_t结构开始的消息作为原始的Mach消息。 handlePortMessage:提供消息作为NSPortMessage对象,它是Mach消息的面向对象的包装器。如果委托没有被设置,NSPort对象处理消息本身。当您完成使用端口对象时,必须在发送释放消息之前明确地使端口对象无效。同样,如果您的应用程序使用垃圾回收,则必须在删除对其的强引用之前使端口对象无效。如果您没有使端口无效,则生成的端口对象可能会留存并造成内存泄漏。要使端口对象无效,请调用其无效方法。基本定义了NSPort的三个具体子类。 NSMachPort和NSMessagePort只允许本地(在同一台机器上)通信。 NSSocketPort允许本地和远程通信,但是对于本地情况,可能比其他的更昂贵。使用allocWithZone:或port创建NSPort对象时,会创建一个NSMachPort对象。
-
NSMachPort
NSMachPort是NSPort的一个子类,包含一个Mach端口,它是macOS中的基本通信端口。 NSMachPort只允许本地(在同一台机器上)通信。 伴随类NSSocketPort允许本地和远程分布式对象通信,但在本地情况下可能比NSMachPort更消耗资源。要有效地使用NSMachPort,您应该熟悉Mach端口,端口访问权限和Mach消息。
使用参考:http://blog.csdn.net/yxh265/article/details/51483822
-
NSMessagePort
用于在连接之间传输对象代理(有时是对象本身)的编码器。一个NSPortCoder实例是被一个NSConnection对象创建和使用,永远不需要直接自己创建或使用一个。
NSPortCoder是分布式对象系统中NSCoder的一个具体子类,用于在NSConnection对象之间传输对象代理(有时是对象本身)。 ;
关于线程间的通信
感谢作者翻译顺便膜拜一下大神:http://www.jianshu.com/p/c0893c93f2cb
线程锁和线程----Locking Threading
-
NSConditionLock
条件锁,一个线程获得了锁,其它线程等待。
使用一个NSConditionLock对象,可以确保一个线程只有在满足某个条件时才能获得一个锁。 一旦获得了锁并执行了代码的关键部分,线程就可以放弃锁并将相关条件设置为新的东西。 条件本身是任意的:你根据需要为你的应用程序定义它们。
理解参考:http://blog.csdn.net/mandmg/article/details/52280067
参考用法:http://blog.csdn.net/growinggiant/article/details/50717974
-
NSDistributedLock
NSDistributedLock是MAC开发中的跨进程的分布式锁,底层是用文件系统实现的互斥锁。NSDistributedLock没有实现NSLocking协议,所以没有lock方法,取而代之的是非阻塞的tryLock方法。
锁由文件系统中的条目(如文件或目录)实现。 对于多个应用程序使用NSDistributedLock对象来协调其活动,该锁定必须在可以运行应用程序的所有主机可访问的文件系统上写入。
使用tryLock方法尝试获取一个锁。 您通常应该使用解锁方法来释放锁而不是breakLock。
NSDistributedLock不符合NSLocking协议,也没有锁定方法。 该协议的锁定方法旨在阻止线程的执行,直到成功。 对于NSDistributedLock对象,这可能意味着以某个预定的速率轮询文件系统。 更好的解决方案是提供tryLock方法,并让您确定对您的应用程序有意义的轮询频率。
-
NSLock
NSLock锁 ,协调同一应用程序中多个执行线程的操作的对象。不能用于实现递归锁
NSLock对象可用于调解对应用程序全局数据的访问,或保护代码的关键部分,使其能够以原子方式运行。
注意:NSLock类使用POSIX线程来实现其锁定行为。 将解锁消息发送给NSLock对象时,必须确保该消息是从发送初始锁定消息的同一个线程发送的。 解锁来自不同线程的锁可能会导致未定义的行为。
你不应该使用这个类来实现一个递归锁。 在同一个线程上调用两次锁定方法会永久锁定线程。 使用NSRecursiveLock类来实现递归锁。
解锁未锁定的锁被视为程序员错误,应在代码中修复。 NSLock类通过向控制台发送错误消息来报告这些错误。
关于锁
总结的很六忍不住点个赞的参考:http://www.jianshu.com/p/35dd92bcfe8c
-
NSOperation
iOS平台提供更高级的并发(异步)调用接口,让你可以集中精力去设计需完成的任务代码,避免去写与程序逻辑无关的线程生成、运行等管理代码。当然实质上是这些接口隐含生成线程和管理线程的运行,从而更加简洁地实现多线程
理解参考:http://blog.csdn.net/bravegogo/article/details/51155906
使用参考:http://www.jianshu.com/p/0c241a4918bf
-
NSBlockOperation
NSBlockOperation用于管理一个或多个块的并发执行的操作。
NSBlockOperation类是NSOperation的一个具体子类,它管理一个或多个块的并发执行。 您可以使用此对象一次执行多个块,而无需为每个块创建单独的操作对象。 当执行多个块时,操作本身只有在所有块完成执行后才被认为是完成的。
添加到块操作的块将以默认优先级调度到适当的工作队列。 块本身不应该对其执行环境的配置做任何假设。
-
NSInvocationOperation
NSInvocationOperation用于管理指定为调用的单个封装任务的执行的操作。
NSInvocationOperation类是NSOperation的具体子类,用于启动一个操作,该操作包括调用指定对象上的选择器。 这个类实现了非并发操作。
NSBlockOperation和NSInvocationOperation
参考 :http://blog.csdn.net/crycheng/article/details/21799611
-
NSOperationQueue
NSOperationQueue用于调节一组操作的执行的NSOperation加入到一个NSOperationQueue中去异步执行队列。
在被添加到操作队列之后,NSOperation实例将保留在该队列中,直到被明确取消或完成其任务。队列中的操作(但尚未执行)本身按照优先级和操作间对象依赖关系进行组织,并相应执行。应用程序可能会创建多个操作队列并将操作提交给其中的任何一个。
即使这些操作位于不同的操作队列中,操作间依赖也为操作提供绝对的执行顺序。操作对象不被视为准备好执行,直到所有依赖操作完成执行。对于准备执行的操作,操作队列总是执行相对于其他就绪操作具有最高优先级的操作队列。有关如何设置优先级别和依赖关系的详细信息
添加后,不能直接从队列中删除操作。操作保持在其队列中,直到它报告完成其任务。完成任务并不一定意味着操作完成任务。操作也可以取消。取消操作对象会将队列中的对象留在队列中,但会通知对象尽快中止其任务。对于当前正在执行的操作,这意味着操作对象的工作代码必须检查取消状态,停止正在执行的操作,并将自己标记为已完成。对于已排队但尚未执行的操作,队列仍必须调用操作对象的start方法,以便它可以处理取消事件并将其标记为已完成。
参考:https://www.cnblogs.com/sfce/p/4329045.html
-
NSRecursiveLock
NSRecursiveLock实际上定义的是一个递归锁,这个锁可以被同一线程多次请求,而不会引起死锁。这主要是用在循环或递归操作中。
参考:http://www.cocoachina.com/ios/20150513/11808.html
-
NSTask (貌似多用于Mac OS编程)
NSTask创建的是一个独立运行的进程,不会与主程序共享存储空间
使用NSTask类,您的程序可以将另一个程序作为子进程运行,并可以监视该程序的执行。 NSTask对象创建一个单独的可执行实体; 它与NSThread的区别在于它不会与创建它的进程共享内存空间。
进程在由当前值定义的几个项目的环境中运行:当前目录,标准输入,标准输出,标准错误以及任何环境变量的值。 默认情况下,NSTask对象从启动它的进程继承它的环境。 如果在过程中有任何值应该不同,例如,如果当前目录应该更改,则在启动它之前必须更改该值。 进程的环境在运行时不能改变。
一个NSTask对象只能运行一次。
注意:在沙盒应用程序中,使用NSTask类创建的子进程将继承父应用程序的沙箱。 您通常应该将帮助器应用程序编写为XPC Services,因为XPC Services允许您为帮助器应用程序指定不同的沙盒权利。
通过NSTask用Cocoa执行perl脚本使用:http://www.cocoachina.com/ios/20090611/97.html
-
NSThread
常用线程之一
当你想让Objective-C方法在自己的执行线程中运行时,使用这个类。 当需要执行冗长的任务时,线程特别有用,但不希望它阻塞应用程序其余部分的执行。 特别是,您可以使用线程来避免阻塞应用程序的主线程,主线程处理用户界面和与事件相关的操作。 线程也可以用来把一个大的工作分成几个较小的工作,这可能会导致多核计算机的性能提高。
NSThread类支持类似于NSOperation的语义来监视线程的运行时状态。 您可以使用这些语义来取消线程的执行或确定线程是否仍在执行或已经完成其任务。 取消线程需要来自线程代码的支持;
参考:http://www.jianshu.com/p/0d4812426f72
通知---- Notifications
-
NSNotification
过通知中心向所有注册观察员广播的信息容器。
NSNotification对象(称为通知)包含名称,对象和可选字典。该名称是标识通知的标签。该对象是通知的发布者想要发送给该通知的观察者的任何对象(通常是发布通知的对象)。字典存储其他相关的对象,如果有的话。 NSNotification对象是不可变的对象。
参考:http://www.jianshu.com/p/a2cb99dcd4fe
-
NSNotificationCenter
通知中心是整个通知机制的关键所在,它管理着监听者的注册和注销,通知的发送和接收。通知中心维护着一个通知的分发表,把所有通知发送者发送的通知,转发给对应的监听者们通知调度机制,可以向登记的观察员广播信息。
对象向通知中心注册,以使用addObserver:selector:name:object:或addObserverForName:object:queue:usingBlock:methods来接收通知(NSNotification对象)。 当一个对象自己添加为观察者时,它指定应该接收哪些通知。 因此一个对象可能会多次调用这个方法,以便注册自己作为几个不同通知的观察者。
每个正在运行的应用程序都有一个defaultCenter通知中心,您可以创建新的通知中心来组织特定情况下的通信。
通知中心只能在单个程序中发送通知; 如果要将通知发布到其他进程或从其他进程接收通知,请改为使用NSDistributedNotificationCenter。
参考:http://www.jianshu.com/p/a2cb99dcd4fe
-
NSDistributedNotificationCenter(mas OS上才有)
每个任务都有一个缺省的分布式通告中心,您可以通过NSDistributedNotificationCenter的defaultCenter类方法来访问。这个分布式通告中心负责处理同一个机器的不通任务之间的通告。如果需要实现不同机器上的任务间通讯,请使用分布式对象。
参考:http://www.cnblogs.com/yongbufangqi1988/p/7224505.html
-
NSNotificationQueue
鉴于通知中心在发布通知时分发通知,放入队列的通知可以被延迟,直到当前通过运行循环结束或者直到运行循环空闲。 重复的通知可以合并,以便只发送一个通知,尽管发布了多个通知。
通知队列以先进先出(FIFO)顺序维护通知。 当通知移动到队列的前面时,队列会将其发送到通知中心,通知中心会将通知分派给注册为观察者的所有对象。
每个线程都有一个默认通知队列,该通知队列与进程的默认通知中心相关联。 您可以创建自己的通知队列,并且每个中心和线程都有多个队列。
创建一个NSNotificationQueue队列(first in-first out),将定义的NSNotification放入其中,并为其指定三种状态之一:
typedef NS_ENUM(NSUInteger, NSPostingStyle) {
NSPostWhenIdle = 1, // 当runloop处于空闲状态时post
NSPostASAP = 2, // 当当前runloop完成之后立即post
NSPostNow = 3 // 立即post,同步(为什么需要这种type,且看三.3)
};
这样,将NSNotification放入queue,然后根据其type,NSNotificationQueue在合适的时机将其post到NSNotificationCenter。这样就完成了异步的需求。
通知概括的很全面:http://www.cocoachina.com/ios/20170426/19124.html
Objective-C语言服务---- Objective-c language Srevices
-
NSCoder
NSCoder数据储存作为对象的基础的抽象类,使其他对象能够存档和分发
NSCoder抽象类声明具体子类使用的接口在内存和其他格式之间传输对象和其他值。此功能为存档(对象和数据项存储在磁盘上)和分配(在不同进程或线程之间复制对象和数据项)提供了基础。由Foundation提供的具体子类是NSArchiver,NSUnarchiver,NSKeyedArchiver,NSKeyedUnarchiver和NSPortCoder。一般将NSCoder的具体子类称为编码器类,将这些类的实例称为编码器对象(或简称为编码器)。只能对值进行编码的编码器对象被称为编码器对象,并且只能将值解码为解码器对象。
NSCoder以对象,标量,C数组,结构和字符串以及指向这些类型的指针进行操作。它不处理实现在不同平台间变化的类型,例如union,void *,函数指针和长链指针。编码器对象将对象类型信息与数据一起存储,因此从字节流解码的对象通常与最初编码到流中的对象具有相同的类。然而,一个对象在编码时可以改变它的类。这在档案和序列编程指南中有描述。
AV Foundation框架将方法添加到NSCoder类中,以便于创建包括Core Media时间结构在内的存档,并从存档中提取Core Media时间结构
参考:https://www.cnblogs.com/xiaofeixiang/p/4266156.html
-
NSArchiver
将对象的数据存储到存档的编码器。
NSArchiver是NSCoder的一个具体子类,它提供了一种将对象编码成可存储在文件中的与体系结构无关的格式。 归档对象图时,每个对象的类信息和实例变量都会写入归档。 伴随类NSUnarchiver对档案中的数据进行解码,并创建与原始组等价的对象图。
NSArchiver将归档数据存储在可变数据对象(NSMutableData)中。 在对对象进行编码之后,可以让NSArchiver对象立即将此可变数据对象写入文件,或者可以检索可变数据对象以供其他用途。
-
NSKeyedArchiver
将对象的数据存储到一键值对引用的存档的编码器。NSKeyedArchiver是NSCoder的一个具体子类,它提供了一种将对象(和标量值)编码成可存储在文件中的与体系结构无关的格式。归档一组对象时,每个对象的类信息和实例变量都写入归档。伴随类NSKeyedUnarchiver解码档案中的数据,并创建一组等同于原始组的对象。
键控存档与非键控存档的不同之处在于,编码到存档中的所有对象和值都被赋予名称或键。解码非键控压缩文件时,必须按照与编码相同的顺序对值进行解码。当解码一个键控存档时,由于数值是按名称来请求的,所以数值可以不按顺序解码,也可以根本不解码。因此,密钥存档为前向和后向兼容提供了更好的支持。
赋予编码值的键只能在当前编码对象的范围内唯一。键控存档是分层的,因此对象A用于编码其实例变量的键不会与对象B使用的键冲突,即使A和B是同一类的实例。但是,在一个对象中,子类使用的键可能与其超类中使用的键相冲突
将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成。
Mac OS X从版本10.2开始支持带键的档案。在此之前,要使用NSArchiver类创建连续的(sequential)归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。
在带键的归档中,每个归档字段都有一个名称。归档某个对象时,会为它提供一个名称,即键。从归档中检索该对象时,是根据这个键来检索的。这样可以按照任意的顺序将对象写入归档并进行检索。另外,如果向类添加了新的实例变量或删除了实例变量,程序也可以进行处理。
-
NSKeyedUnarchiver
NSKeyedUnarchiver是一个解码器,用于从键值引用的存档中恢复数据。
NSKeyedUnarchiver是NSCoder的一个具体子类,定义了从一个键入的存档解码一组命名对象(和标量值)的方法。这样的档案由NSKeyedArchiver类的实例产生。
键控归档被编码为对象的层次结构。层次结构中的每个对象都作为其他对象编码的名称空间。可用于解码的对象仅限于在特定对象的直接范围内编码的对象。在层次结构的其他地方编码的对象,不论是高于,低于还是与此特定对象平行,都是不可访问的。通过这种方式,特定对象用于编码其实例变量的键只需在该对象的范围内是唯一的。
如果使用归档中不存在的键调用此类的其中一个decode ...方法,则返回非正值。该值因解码类型而异。例如,如果存档中不存在密钥,则decodeBoolForKey:返回NO,decodeIntForKey:返回0,decodeObjectForKey:返回nil。
NSKeyedUnarchiver支持有限类型的强制。编码为任何类型的整数的值,无论是标准的int还是明确的32位或64位整数,都可以使用任何整数解码方法来解码。同样,编码为float或double的值可以解码为float或double值。如果编码值太大而不能适应强制类型,则解码方法将抛出NSRangeException。此外,当试图强制一个不兼容类型的值时,例如将一个int解码为一个float,解码方法将抛出一个NSInvalidUnarchiveOperationException异常。
NSKeyedArchiver 和NSKeyedUnarchiver
参考:http://www.jianshu.com/p/6ad8447ce8ac
-
NSUnarchiver
NSUnarchiver类可以通过解码归档文件获得对象。从档案中恢复数据的解码器。
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实例是自动创建的,用于处理错误断言。断言宏,比如NSAssert和NSCAssert,用于评估一个条件,如果条件评估为错误,这个宏向NSAssertionHandler实例发送一个表示错误的字符串。每个线程都有它自己的NSAssertionHandler实例。断言处理程序调用的时候,会打印一条错误信息,包含断言的方法或类,并抛出一个NSInternalInconsistencyException。
参考:http://blog.csdn.net/baitongzbt/article/details/39833935
-
NSAutoreleasePool
自动释放池 :当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池 定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放
参考:http://blog.csdn.net/tongseng/article/details/52101476
-
NSClassDescription
NSClassDescription用于查询类的关系和属性的接口的抽象类。
NSClassDescription的具体子类提供了特定类的对象的可用属性以及该类与其他类之间的关系。定义类之间的这些关系允许使用键值编码更智能和灵活地处理对象。
需要注意的是,默认情况下没有类描述。要在你的代码中使用NSClassDescription对象,你必须为你的模型类实现它们。对于所有具体的子类,您必须为NSClassDescription的所有实例方法提供实现。 (NSClassDescription只提供维护已注册类描述缓存的类方法的实现。)创建后,必须使用NSClassDescription方法registerClassDescription:forClass:注册类描述。
您可以在由诸如attributeKeys和toManyRelationshipKeys等方法返回的数组中使用NSString对象来访问(使用键值编码)类描述对象所对应类的实例的属性。有关属性和关系的更多信息,请参阅Cocoa基础知识指南。有关键值编码的更多信息,请参阅键值编码编程指南。
用于映射可编写脚本类之间关系的NSScriptClassDescription是作为Cocoa框架的一部分提供的NSClassDescription的唯一具体子类。
-
NSException
控制台输出的日志信息就是NSException产生的,一旦程序抛出异常,程序就会崩溃,控制台就会有这些崩溃日志。
最熟悉的陌生类 强大的令人窒息 感谢作者让我知道了这个家伙
参考:http://www.jianshu.com/p/05aad21e319e
-
NSLnvocation
在消息转发中提到过NSInvocation这个类,这里说一下我所理解的NSInvocation。NSInvocation 是命令模式的一种实现,它包含选择器、方法签名、相应的参数以及目标对象。所谓的方法签名,即方法所对应的返回值类型和参数类型。当NSInvocation被调用,它会在运行时通过目标对象去寻找对应的方法,从而确保唯一性,可以用[receiver message]来解释。实际开发过程中直接创建NSInvocation的情况不多见,这些事情通常交给系统来做
很六的类
参考:http://www.jianshu.com/p/05aad21e319e
-
NSMethodSignature
NSMethodSignature顾名思义应该就是“方法签名”,类似于C++中的编译器时的函数签名。
官方定义该类为对方法的参数、返回类似进行封装,协同NSInvocation实现消息转发。
参考:http://blog.csdn.net/dean19900504/article/details/8737862
-
NSUndoManager
NSUndoManager允许记录用户执行的操作并且反转这类操作。
当你调用一个可以改变一些东西的方法或者是执行一个改变属性值的动作(例如 setter 方法)时,你可以注册这个操作来进行撤销。
一个撤销操作包含了接收消息的对象,发送消息以及参数 - 通常你会传入原始值。
NSUndoManager实例支持重做操作,所以才能逆转操作。你可以认为这个管理器拥有两个栈。实际上,它管理两个栈,undo(撤销)栈和redo(重做)栈 - 对应NSUndoManager的私有属性_undoStack和_redoStack,里面存储着一些操作。
妈妈再也不担心我弄错东西了
参考:http://www.jianshu.com/p/df572c44a82c