所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象都是NSObject,NSObject就处在Foundation框架之中
值对象—Value
一个图形坐标变换
转换指定一个坐标系中的点如何转换为另一个坐标系中的点。 仿射变换是一种特殊类型的变换,保留路径中的平行线,但不一定保留长度或角度。 缩放,旋转和平移是仿射变换支持的最常用的操作,但剪切也是可能的。
日历类 定义日历(如年代,年和时区时间)与绝对时间点之间关系的对象,提供用于计算和比较日期的功能。
NSCalendar对象封装了定义一年的开始,长度和分区的计算系统的信息。 他们提供有关日历的信息,并支持日历计算,例如确定给定日历单位的范围,并将单位添加到给定的绝对时间。
SD图片缓存就用的该类 一个可变集合,用于临时存储临时键值对,在资源不足的情况下被释放。
NSCache类包含了各种自动释放内存的机制,可以确保缓存不会占用太多的系统内存。如果其他应用程序需要内存,这些机制会从缓存中删除一些项目,从而最大限度地减少其内存占用。
您可以从不同的线程中添加,删除和查询缓存中的项目,而无需自己锁定缓存。
与NSMutableDictionary对象不同,缓存不会复制放入其中的关键对象。
您通常使用NSCache对象临时存储对象与创建重要的临时数据。重用这些对象可以提供性能优势,因为它们的值不必重新计算。但是,这些对象对应用程序并不重要,如果内存不足,可以将其释放。如果释放,则需要时重新计算它们的值。
具有可以在不使用时释放的子组件的对象可以采用NSDiscardableContent协议来改善缓存机制的行为。默认情况下,如果缓存中的NSDiscardableContent对象的内容被释放,它们将被自动删除,尽管这个自动删除机制是可以改变的。如果一个NSDiscardableContent对象被放入缓存中,缓存在移除时调用discardContentIfPossible。
NSData,数据,内存中的静态字节缓冲区,当我们需要把一些信息写入到文件里或发送到网络上,我们需要把这些数据转换下,变成纯粹的0、1字符流。也就是网络中要传数据的的时候,我们通常会用相应的NSData的数据来进行存储。。
NSMutableData,数据 内存中表示动态字节缓冲区的对象。当我们需要把一些信息写入到文件里或发送到网络上,我们需要把这些数据转换下,变成纯粹的0、1字符流。也就是网络中要传数据的的时候,我们通常会用相应的NSData的数据来进行存储。。
NSMutableData及其超类NSData为字节缓冲区提供数据对象或面向对象的包装器。 数据对象让简单分配的缓冲区(也就是没有嵌入式指针的数据)承担基础对象的行为。 它们通常用于数据存储,而且在分布式对象应用程序中也很有用,其中包含在数据对象中的数据可以在应用程序之间复制或移动。 NSData创建静态数据对象,NSMutableData创建动态数据对象。 您可以轻松地将一种类型的数据对象转换为另一种类型的数据对象,并将NSData对象或NSMutableData对象作为参数。
包含字节的可变数据对象,不再需要时可以将其释放。
NSPurgeableData对象继承自其超类NSMutableData的创建方法,同时提供NSDiscardableContent协议的默认实现。
所有NSPurgeableData对象开始“访问”,以确保它们不会立丢弃即被释放。beginContentAccess方法将对象的字节标记为“被访问”,从而防止它们被释放,并且在访问对象之前必须被调用,否则将会出现异常如果字节没有被释放,并且被成功标记为“被访问”,这个方法返回YES,任何直接或间接访问这些字节的方法或者它们在不被“访问”的时候都会产生一个异常。你使用完成了数据,调用endContentAccess来允许它们被释放,以便快速释放内存。
您可以自己使用这些对象,并且不一定必须将它们与NSCache结合使用才能获得清除行为。 NSCache类整合了一些缓存机制和一些自动删除机制,以确保其内存占用不会太大。
不应将NSPurgeableData对象用作基于哈希的集合中的键,因为字节指针的值在每次数据变化之后都会更改。
获取日期(例如获取当前手机上的时间 但是获取不了日历等) 特定时间点的表示,与任何日历或时区无关。
NSDate对象封装了一个时间点,与任何特定的日历系统或时区无关。 日期对象是不可变的,表示相对于绝对引用日期(2001年1月1日00:00:00 UTC)的不变时间间隔。
NSDate类提供了比较日期的方法,计算两个日期之间的时间间隔,并从相对于另一个日期的时间间隔创建一个新的日期。 NSDate对象可以与NSDateFormatter对象一起使用来创建日期和时间的本地化表示,以及使用NSCalendar对象执行日历算术。
被弃用改为NSCalendar
NSDateComponents是一个与日期有关的类,但这个类具体是干吗的呢?我们现从字面上的意思来理解。Components就是零件、组件的意思,其实这个类的作用就是把日期拆分成一个一个的组件。一个日期是有年月日时分秒组成的,components这个类的作用就是把日期拆分成单独的年、月、日、时、分、秒。提供用于计算和比较日期的功能。
NSDateComponents以可扩展的,面向对象的方式封装日期的组件。 它用于通过提供组成日期和时间的时间组件来指定日期:小时,分钟,秒,日,月,年等。 您也可以使用它来指定持续时间,例如5小时16分钟。 NSDateComponents对象不需要定义所有组件字段。 当创建NSDateComponents的新实例时,日期组件被设置为NSDateComponentUndefined。
对比NSDecimalNumber该类可以精确控制保留小数位数 采用十进制数行为协议的类。
这个类允许你设置一个NSDecimalNumber对象取整的方式并处理错误,而不必创建一个自定义的类。
你可以使用这个类的一个实例作为任何以…行为结束的NSDecimalNumber方法的参数。 如果你不认为你需要特殊的行为,你可能不需要这个类 - 它很可能是NSDecimalNumber的默认行为将适合您的需要。
NSDecimalNumber和NSDecimalNumberHandler 区别
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:2
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO]; //保留2位小数
scale: 小数点后保留的位数
RoundingMode: 小数保留的类型
根据官方文档说明, 枚举值分析:
NSRoundPlain, 四舍五入
NSRoundDown, 只舍不入
NSRoundUp, 只入不舍
NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
类返回本地化信息,主要体现在"语言"和"区域格式"这两个设置项
您通常使用语言环境来格式化和解释关于用户的习惯和偏好的信息。您可以使用initWithLocaleIdentifier初始化任意数量的区域设置实例:使用availableLocaleIdentifiers数组中找到的某个区域设置标识符。 但是,您通常使用配置为匹配当前用户的首选项的区域设置。使用currentLocale属性获取与当前用户首选项匹配的区域设置。 如果您需要在用户更改区域设置时收到警报,请注册NSCurrentLocaleDidChangeNotification通知。 或者,您可以使用autoupdatingCurrentLocale属性来获取一个使用用户的配置设置自动更新的区域
Objective-C是C的一个超集,主要引入了OO的设计理念。所以,Objective-C不可避免地使用指针以及指针变量来描述一个对象的内存地址。那么,既然存在指针这种东西,当然就允许存在NULL指针,也就是空指针。
另外,Objective-C主要定义了两种容器:NSArray和NSDictionary,并且规定了这两种容器中都不能放置nil指针,只能存放NSObject对象。那么就存在有些场景确实需要存nil指针,可能是出于保证count的正确性的目的。所以,在需要存放nil指针的位置就存放了NSNull对象,用来表示空对象,除此之外无任何实际意义。这也就是为什么Cocoa需要设计NSNull的原因。
表示时区信息 包含与特定国家区域相关的标准时间约定信息的对象。
和时间相关的最重要的一个因素, 因为各个地区的时区都不一样, 所以时间的差别是很大的, 这就是所谓的时差 时区国家区域划分。因此,这些对象具有这些区域的名称。时区对象还表示格林尼治标准时间(GMT)和缩写(例如太平洋标准时间的PST)的时间偏移量,加号或减号。
一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一直是不可枚举的
NSNumber:专门用来装基础类型的对象,把整型、单精度、双精度、字符型等基础类型存储为对象
NSArray\NSDictionary中只能存放OC对象, 不能存放int\float\double等基本数据类
如果真想把基本数据(比如int)放进数组或字典中, 需要先将基本数据类型包装成OC对象,把 int /float /double -----> 包装成一个对象
NSDecimalNumber是NSNumber的不可变子类。苹果针对浮点型计算时存在精度计算误差的问题而提供的一个计算类,它是基于10进制的定点计算保证了精度不会缺失。同时也可以定制精度的取正类型:向上取正、向下去正、四舍五入等。相对与浮点类型的计算,NSDecimalNumber提供了更加精准的计算。
主要用于数据类型的变换(如Model?View等),变换可以是单向或双向的。NSValueTransformer是一个抽象类,所有的类型变换都在NSValueTransformer的子类中定义
通过继承NSValueTransformer并重写必要的方法来创建一个值转换器,以提供所需的自定义转换。然后使用setValueTransformer:forName:方法注册值转换器,以便应用程序的其他部分可以通过名称valueTransformerForName:来访问它。
使用transformedValue:方法将值从一种表示转换为另一种表示。如果值转换器通过为allowReverseTransformation返回YES来指定其转换是可逆的,则还可以使用reverseTransformedValue:以相反方式执行转换。例如,反转字符串中的字符是可逆操作,而将字符串中的字符更改为大写字符是不可逆的操作。
值转换器可以接受一种类型的输入并返回不同类型的值。例如,一个值转换器可以带一个NSImage或UIImage对象,并返回一个包含该图像的PNG表示的NSData对象。
MXL解析-----XML
NSXMLParser是事件驱动的XML文档解析器 NSXMLParser采取的是SAX方式解析,特点是事件驱动,当扫描到文档和元素都会通知代理
NSXMLParser通知其委托关于在处理XML文档时遇到的项目(元素,属性,CDATA块,注释等)。 除了报告之外,它本身不会对这些解析的项目做任何事情。 它也报告解析错误。 为了方便起见,以下描述中的NSXMLParser对象有时被称为解析器对象。 除非在回调中使用,否则NSXMLParser是一个线程安全的类,只要任何给定的实例只在一个线程中使用。
字符串------Strings
NSCharacterSet类似一个字符串处理工具类 表示用于搜索操作的一组固定Unicode字符值的对象。
NSCharacterSet对象表示一组符合Unicode的字符。 NSString和NSScanner对象使用NSCharacterSet对象将字符组织在一起进行搜索操作,以便在搜索过程中可以找到任何特定的字符集。集群的两个公共类NSCharacterSet和NSMutableCharacterSet分别声明静态和动态字符集的编程接口。
使用这些类创建的对象被称为字符集对象(并且不会导致混淆,仅作为字符集)。由于类簇的性质,字符集对象不是NSCharacterSet或NSMutableCharacterSet类的实际实例,而是其私有子类之一的实际实例。虽然字符集对象的类是私有的,但是它的接口是公共的,如这些抽象超类NSCharacterSet和NSMutableCharacterSet所声明的。字符集类采用NSCopying和NSMutableCopying协议,方便将一种字符集转换为另一种字符集。
NSMutableCharacterSet类似一个字符串处理工具类表示用于搜索操作的可变Unicode字符值集合的对象。
NSMutableCharacterSet类声明编程接口来管理一组可修改的Unicode字符的对象。 您可以添加或删除可变字符集中的字符作为NSRange结构中的数字值,或者作为字符串中的字符值,通过联合或交叉组合字符集并反转字符集。
可变字符集的使用效率低于不可变字符集。 如果创建后不需要更改字符集,请使用copy创建一个不可变的副本。
NSMutableCharacterSet没有定义原始方法。 除了NSCharacterSet的原语之外,子类必须实现由这个类声明的所有方法。 他们还必须实现mutableCopyWithZone :
NSCharacterSet和 NSMutableCharacterSet的部分区别
一个静态的纯文本Unicode字符串对象。
NSString类及其可变子类NSMutableString提供了一组用于处理字符串的API,包括用于比较,搜索和修改字符串的方法。 NSString对象用于整个Foundation和其他Cocoa框架,作为平台上所有文本和语言功能的基础。
一个动态的纯文本Unicode字符串对象。
NSMutableString类声明编程接口到一个对象,该对象管理一个可变字符串,也就是说,一个字符串的内容可以被编辑,它在概念上代表一个Unicode字符数组。 为了构造和管理一个不可变的字符串,或者是一个在创建后不能改变的字符串,可以使用NSString类的一个对象。
NSMutableString类为从NSString继承的基本字符串处理行为添加一个基本方法replaceCharactersInRange:withString:。 所有其他修改字符串的方法都通过这个方法来工作。 例如,insertString:atIndex:简单地替换0长度范围内的字符,而deleteCharactersInRange:替换给定范围内不带字符的字符。
NSString和NSMutableString
一个抽象类,为创建,解释和验证值的文本表示形式的对象声明一个接口。
NSFormatter是用于子类化的。 自定义格式化程序可以限制输入并以新颖的方式增强数据的显示。 例如,您可以使用自定义格式器,以确保用户输入的序列号符合预定义的格式。 在决定创建自定义格式器之前,请确保您不能配置公共子类来满足您的要求。
NSDateFormatter是系统提供的一个用于时间格式化的类,用于在日期和文本表示之间进行转换,可是每次创建这个类的来做时间转换的消耗却是很大的,这个时候就需要程序猿来进行优化.
NSDateFormatter的实例创建NSDate对象的字符串表示,并将日期和时间的文本表示转换为NSDate对象。 对于用户可见的日期和时间表示,NSDateFormatter提供了各种本地化的预设和配置选项。 对于日期和时间的固定格式表示,您可以指定自定义格式字符串。
NSDateFormatter是系统提供的一个用于在数值和文本表示之间进行转换。
NSNumberFormatter的实例格式化包含NSNumber对象的单元格的文本表示形式,并将数字值的文本表示形式转换为NSNumber对象。 该表示包含整数,浮点数和双精度; 浮动和双打可以格式化到指定的小数位。 NSNumberFormatter对象也可以在单元格可以接受的数值上施加范围。
该类为一个从字符串中扫描值的类簇的抽象超类。
NSScanner对象将NSString对象的字符解释并转换为数字和字符串值。您在创建扫描仪时指定扫描仪的字符串,当您请求时,扫描仪从头到尾遍历该字符串的字符。
由于类簇的性质,扫描器对象不是NSScanner类的实际实例,而是其私有子类之一。尽管扫描器对象的类是私有的,但它的接口是公共的,正如这个抽象超类NSScanner所声明的那样。 NSScanner的原始方法是NSScanner和配置扫描器下列出的所有方法。你使用这个类创建的对象被称为扫描器对象(当不会造成混淆,只是作为扫描器)。
您可以将NSScanner对象设置为在使用charactersToBeSkipped属性扫描字符串时忽略一组字符。扫描目标之前跳过跳过集中的字符。要跳过的默认字符集是空格和换行字符集。
NSSortDescriptor是用来指定排序规则, 对集合等进行排序时指定结果的排序规则生产不可变对象。
您可以通过指定要比较的属性的key和排序顺序(升序或降序)来构造NSSortDescriptor的实例。 或者,您也可以指定一个选择器来执行比较,它允许您指定其他比较选择器,例如localizedStandardCompare:和localizedCaseInsensitiveCompare :. 如果要排序的对象不响应排序描述符的比较选择器,则排序引发异常。
集合类----- Collections
NSArray对象的静态有序集合只能够存贮OC对象。
NSArray及其子类NSMutableArray管理被称为数组的对象的有序集合。 NSArray创建静态数组,NSMutableArray创建动态数组。 当需要对象的有序集合时,可以使用数组。
NSMutableArray对象的动态有序集合。
NSMutableArray类将编程接口声明为管理可修改对象数组的对象。 该类将插入和删除操作添加到从NSArray继承的基本数组处理行为。
NSMutableArray和NSArray
NSDictionary是一个无序的静态集合,也可称之为键值对。与数组不同的是字典可以通过特定的key快速查找到想要的值,而不用遍历字典。所以一个唯一的key只能对应一个值,而多个key可以对应同一个值。
NSDictionary类将编程接口声明为管理键和值的不可变关联的对象。当你需要一个方便有效的方法来检索与任意键相关的数据时,使用这个类或它的子类NSMutableDictionary。 NSDictionary创建静态字典,NSMutableDictionary创建动态字典。 (为了方便起见,术语词典指的是这些类中的一个类的任何实例,而没有指定其确切的类成员资格。)
字典中的键值对称为条目。每个条目由代表键的一个对象和作为该键的值的第二个对象组成。在字典中,密钥是唯一的。也就是说,单个字典中没有两个密钥是相等的(由isEqual确定:)。一般来说,一个键可以是任何对象(只要它符合NSCopying协议,见下文),但是请注意,使用键值编码时,键必须是一个字符串(请参阅访问对象属性)。无论是键还是值都不为零。如果您需要在字典中表示空值,则应该使用NSNull。
NSMutableDictionary是一个无序的动态集合,也可称之为键值对。与数组不同的是字典可以通过特定的key快速查找到想要的值,而不用遍历字典。所以一个唯一的key只能对应一个值,而多个key可以对应同一个值。
NSMutableDictionary类将编程接口声明为管理键和值的可变关联的对象。 它将修改操作添加到从NSDictionary继承的基本操作。
NSDictionary 和 NSMutableDictionary
一个抽象类,其子类枚举对象的集合 依附于集合类(NSArray,NSSet,NSDictionary),没有用来创建实例的接口 对可变数组进行枚举操作时,不能通过添加或删除对象这类方式来改变数组容器。
所有创建方法都是在集合类中定义的,例如NSArray,NSSet和NSDictionary,它们提供了特殊的NSEnumerator对象来枚举它们的内容。例如,NSArray有两个方法返回一个NSEnumerator对象:objectEnumerator和reverseObjectEnumerator。 NSDictionary也有两个方法返回一个NSEnumerator对象:keyEnumerator和objectEnumerator。这些方法允许您分别按键或值枚举字典的内容。
您将nextObject重复发送到新创建的NSEnumerator对象,以使其返回原始集合中的下一个对象。当收集用完时,返回nil。枚举器用尽后,不能“重置”它。要再次枚举集合,您需要一个新的枚举器。
NSDirectoryEnumerator,目录枚举类,一个NSDirectoryEnumerator对象列举了一个目录的内容,返回的所有文件在目录中的路径名,在该目录中。这些路径是相对于目录而言的
索引路径
在列表中表示嵌套数组树中特定位置的路径。索引路径中的每个索引都表示从列表中的一个节点到另一个更深的节点的子数组索引。
NSIndexSet类代表一个不可变的独特的无符号整数的集合,表示另一个集合中索引的唯一整数值的不可变集合。称为索引,因为使用它们的方式。这个集合被称为索引集。你不应该使用索引集存储任意集合的整数值,因为索引集按索引排序范围的方式存储的。这使得它们更有效率比存储单个整数的集合。这也意味着每个索引值指数中只能出现一次。通俗点讲NSIndexSet就是一个唯一的,有序的,无符号整数
NSIndexSet类表示一个唯一无符号整数的不可变集合,因为它们被使用的方式而被称为索引。这个集合被称为索引集。索引必须在范围0 … NSNotFound - 1。
您可以在代码中使用索引集来将索引存储到其他数据结构中。例如,给定一个NSArray对象,可以使用索引集来标识该数组中的对象的子集。
您不应使用索引集来存储任意整数值的集合,因为索引集将索引存储为已排序的范围。这使得它们比存储单个整数集合更有效率。这也意味着每个索引值只能在索引集中出现一次。
NSMutableIndexSet类代表一个可变的独特的无符号整数的集合,类代表一个可变的独特的无符号整数的集合
NSMutableIndexSet类表示一个唯一无符号整数的可变集合,因为它们被使用的方式而被称为索引。 这个集合被称为可变索引集。 有效索引的包含范围是0 …(NSNotFound - 1); 试图使用这个范围以外的索引是无效的。
可变索引集中的值总是排序的,所以添加值的顺序是不相关的。
集合:一个静态无序的唯一对象集合。 集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址;不过NSArray是有序的集合,NSSet是无序的集合。集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。存储的所有对象只能有唯一一个,不能重复。
集合:一个可变无序的唯一对象集合。 集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址;不过NSArray是有序的集合,NSSet是无序的集合。集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。存储的所有对象只能有唯一一个,不能重复。
将一个或多个属性或关系设置为一个或多个值的命令。
NSCountedSet对象的每个不同的对象都有一个与之相关的计数器当对象相同的时候计数器就会加1
谓词—Predicates
NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。
可以使用谓词来表示逻辑条件,用于描述对象持久性存储在内存中的对象过滤。其实意思就是:我是一个过滤器,不符合条件的都滚开。
NSExpression用于表示谓词表达式。比较操作在一个NSPredicate基于两个表达式,由NSExpression类的实例。表达式创建常量值,关键路径,等等
NSPredicate中的比较操作基于两个表达式,如NSExpression类的实例所示。 表达式是为常量值,键路径等创建的。
通常,NSExpression类层次结构中任何地方都有复合API和子类型,它们只能合理地响应该API的一个子集,调用一个对该子类型没有意义的方法将导致异常被抛出。
NSPredicate是一个Foundation类,它指定数据被获取或者过滤的方式。它的查询语言就像SQL的WHERE和正则表达式的交叉一样,提供了具有表现力的,自然语言界面来定义一个集合被搜寻的逻辑条件。
一个专门用于比较表达式的谓词。
您可以使用比较谓词来比较两个表达式的结果。 您可以使用运算符,左表达式和右表达式创建比较谓词。 您使用NSExpression类的实例来表示表达式。 当您评估谓词时,它将以BOOL值的形式返回运算符与评估表达式结果的结果。
NSPredicate 和 NSComparisonPredicate
一个专门的谓词,用于评估其他谓词的逻辑组合。
使用NSCompoundPredicate创建零个或多个其他谓词的属性或OR复合谓词,或者创建一个谓词的NOT。 对于逻辑属性和OR操作:一个AND谓词没有subpredicates评估为YES。没有子预测的OR谓词评估为NO。具有一个或多个子类的复合谓词评估其子类的真相。
操作系统服务类—Operating-System Services
获取系统的错误信息.系统有关错误情况的信息,包括域,域特定的错误代码和特定于应用程序的信息。
网络上单个主机的表示。主机域名
NSHost类提供访问主机的网络名称和地址信息的方法。 NSHost类的实例表示网络上的单个主机。使用NSHost对象获取当前主机的名称和地址,并按名称或地址查找其他主机。
要创建NSHost对象,请使用currentHost,hostWithAddress:或hostWithName:类方法(不要使用alloc和init)。这些方法使用可用的网络管理服务来发现所请求主机的所有名称和地址。但是,他们不会尝试联系主机本身。这种方法避免了由于主机不可用而导致的不合时宜的延迟,但是可能导致关于主机的信息不完整。
NSHost对象包含网络管理服务为给定主机发现的所有网络地址和名称。每个NSHost对象可能包含多个地址,并且有多个名称。如果NSHost对象具有多个名称,则其他名称是同名的变体,通常是基本主机名加上完全限定的域名。
NSNetService类代表一个网络服务,使用NSNetService发布这个service
NSNetService类代表一个网络服务,无论是你的应用程序发布还是客户端。这个类和NSNetServiceBrowser类使用多播DNS来向应用程序传递有关网络服务的信息。 NSNetService的API提供了一种方便的方式来发布应用程序提供的服务,并解析服务的套接字地址。
使用NSNetService访问的服务类型与使用BSD套接字直接访问的类型相同。 HTTP和FTP是系统通常提供的两种服务。 (有关公共服务和这些服务使用的端口的列表,请参阅文件/ etc / services。)应用程序还可以定义自己的定制服务,以向客户端提供特定的数据。
您可以使用NSNetService类作为服务的发布者或服务的客户端。如果您的应用程序发布服务,您的代码必须获取一个端口并准备一个套接字与客户端通信。一旦你的套接字准备好了,你就可以使用NSNetService类来通知客户你的服务已经准备好了。如果您的应用程序是网络服务的客户端,则可以直接创建NSNetService对象(如果您知道确切的主机和端口信息),也可以使用NSNetServiceBrowser对象浏览服务。
要发布服务,请使用服务名称,域,类型和端口信息初始化您的NSNetService对象。所有这些信息必须对您的应用程序创建的套接字有效。初始化后,调用发布方法将您的服务信息广播到网络。
连接到服务时,使用NSNetServiceBrowser类来定位网络上的服务并获取相应的NSNetService对象。获得对象后,请调用resolveWithTimeout:方法来验证服务是否可用并已准备好用于应用程序。如果是,地址属性将提供可用于连接到服务的套接字信息。
NSNetService的方法是异步运行的,所以你的应用程序不受网络速度的影响。所有关于服务的信息都通过NSNetService对象的委托返回给你的应用程序。您必须提供一个委托对象来响应消息并适当地处理错误。
NSNetServiceBrowser用于监听查询网络上的 service,使用多播DNS在网络上查找已发布的service。
服务范围可以从标准服务(如HTTP和FTP)到由其他应用程序定义的定制服务。您可以在代码中使用网络服务浏览器来获取可访问域的列表,然后为每个发现的服务获取NSNetService对象。每个网络服务浏览器一次执行一个搜索,因此如果要执行多个同时搜索,请使用多个网络服务浏览器。
网络服务浏览器使用当前运行循环异步执行所有搜索,以在后台执行搜索。搜索结果将通过客户端应用程序必须提供的关联委托对象返回。搜索在后台进行,直到对象收到停止消息。
描述通常用于拼写和语法检查的一段文本的语言内容。
一个NSOrthography实例描述:
文本包含哪些脚本
一个主导语言,可能还有其他语言的每个脚本。
作为整体文本的统治脚本和语言。
脚本统一由标准的四字母标签(Latn,Grek,Cyrl等)来描述,其中Jpan和Kore标签通常用于日文和韩文文本,Hans和Hant用于中文文本; 如果特定脚本不能识别,则使用标签Zyyy。 有关国际化的更多信息,请参阅“国际化和本地化指南”。
语言由BCP-47标签统一描述,最好以规范的形式表示; 如果无法确定特定的语言,则使用标签和标签。
关于当前进程的信息的集合。
每个进程都有一个共享的NSProcessInfo对象,称为进程信息代理。进程信息代理可以返回参数,环境变量,主机名和进程名等信息。 processInfo类方法返回当前进程的共享代理 - 也就是对象发送消息的进程。
管理输入源的对象的编程接口。
NSRunLoop对象处理来自窗口系统的鼠标和键盘事件,NSPort对象和NSConnection对象的输入。 一个NSRunLoop对象也处理NSTimer事件。您的应用程序既不创建也不显式管理NSRunLoop对象。 每个NSThread对象(包括应用程序的主线程)都根据需要自动创建一个NSRunLoop对象。 如果您需要访问当前线程的运行循环,则可以使用类方法currentRunLoop进行操作。
NSTextCheckingResult类的子类,主要用于检测半结构化的数据:日期,地址,电话号码,正则表达式等等。
NSTextCheckingResult的实例由NSRegularExpression类和NSDataDetector类返回,检测内容的。 在这些情况下,找到的可能是正则表达式或日期,地址,电话号码等的匹配。
子类NSDataDetector和NSTextCheckingResult的使用
计时器在经过一段时间后触发,并将指定的消息发送到目标对象。
定时器与运行循环一起工作。 运行循环保持对定时器的强引用,因此,在将定时器添加到运行循环后,您不必维护自己对定时器的强引
计时器不是一个实时机制。 如果在长时间循环调用期间发生定时器的触发时间,或者运行循环处于未监视定时器的模式,定时器将在下次运行循环检查定时器时才触发。 因此,计时器触发的实际时间会显着延迟
用户默认数据库的接口,也可以在给定设备上跨应用程序的调用持久地存储键/值对。
NSUserDefaults类提供了一个编程接口来与默认系统进行交互。默认系统允许应用程序自定义其行为以匹配用户的偏好。例如,您可以允许用户确定应用程序显示的测量单位或文档自动保存的频率。应用程序通过将值分配给用户默认数据库中的一组参数来记录此类偏好。这些参数被称为默认值,因为它们通常用于确定应用程序在启动时的默认状态或默认情况下的默认状态。
在运行时,您可以使用NSUserDefaults对象来读取应用程序在用户的默认数据库中使用的默认值。 NSUserDefaults缓存信息以避免每次需要默认值时打开用户的默认数据库。同步方法会按周期自动调用,使内存中的缓存与用户的默认数据库保持同步。
NSUserDefaults类提供了访问常见类型(如浮点数,双精度,整数,布尔值和URL)的便捷方法。一个默认对象必须是一个属性列表 - 也就是,一个实例(或集合,实例的组合):NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果要存储任何其他类型的对象,则通常应将其存档以创建NSData的实例。
即使将可变对象设置为值,从NSUserDefaults返回的值也是不可变的。例如,如果将可变字符串设置为“MyStringDefault”的值,则稍后使用stringForKey检索的字符串将是不可变的。
默认数据库是为每个用户自动创建的。 NSUserDefaults类目前不支持每个主机的首选项。为此,您必须使用CFPreferences API(请参阅首选项实用程序)。但是,NSUserDefaults正确读取每个主机的首选项,因此您可以安全地将CFPreferences代码与NSUserDefaults代码混合。
文件系统----File System
bundle 是一个目录,其中包含了程序会使用到的资源,这些资源包含了图像,声音,编译好的代码,nib文件(用户也会把bundle称plug-in),对应bundle,cocoa提供了类NSBundle 存储在磁盘上的捆绑目录中的代码和资源。
苹果使用捆绑来代表应用程序,框架,插件和许多其他特定类型的内容。软件包将其包含的资源组织到定义明确的子目录中,软件包结构因平台和软件包的类型而异。通过使用捆绑对象,您可以在不知道捆绑的结构的情况下访问捆绑的资源。捆绑对象提供一个单一的界面来定位项目,考虑到捆绑结构,用户偏好,可用的本地化和其他相关因素。
任何可执行文件都可以使用一个bundle对象来定位资源,可以在应用程序的bundle中找到,也可以在位于别处的已知bundle中找到。您不使用捆绑对象来查找容器目录中的文件或文件系统的其他部分中的文件。
使用捆绑对象的一般模式如下:
为预期的捆绑目录创建一个捆绑对象。
使用捆绑对象的方法来定位或加载所需的资源。
使用其他系统API与资源进行交互。
某些类型的常用资源可以在没有捆绑的情况下找到并打开。例如,加载图像时,将图像存储在资产目录中,并使用UIImage或NSImage的imageNamed:方法加载它们。同样,对于字符串资源,您可以使用NSLocalizedString来加载单个字符串,而不是自己加载整个.strings文件
NSFileHandle 此类主要是对文件内容进行读取和写入操作,文件描述符的面向对象的包装器
可以使用文件句柄对象来访问与文件,套接字,管道和设备关联的数据。对于文件,您可以在文件中读取,写入和查找。对于套接字,管道和设备,可以使用文件句柄对象来监视设备并异步处理数据。
NSFileHandle的大多数创建方法都会使文件句柄对象获取相关文件描述符的所有权。这意味着文件句柄对象都会创建文件描述符,并且负责在稍后关闭它,通常在文件句柄对象本身被释放的时候。如果您想使用与您创建的文件描述文件句柄对象,请使用initWithFileDescriptor:方法或使用initWithFileDescriptor:closeOnDealloc:方法,并传递NO的标志参数。
运行循环注意事项
使用文件句柄对象与套接字异步通信时,必须从具有活动运行循环的线程启动相应的操作。尽管读取,接受和等待操作本身是在后台线程上异步执行的,但文件句柄使用运行循环源来监视操作并适当地通知您的代码。因此,必须从应用程序的主线程或从已配置运行循环的任何线程中调用这些方法,并使用它们来处理事件。
NSFileMange 此类主要是对文件进行的操作以及文件信息的获取
NSFileManager对象允许您检查文件系统的内容并对其进行更改。 NSFileManager类提供了对适用于大多数类型文件相关操作的共享文件管理器对象的方便访问。文件管理器对象通常是与文件系统交互的主要模式。您可以使用它来查找,创建,复制和移动文件和目录。您还可以使用它来获取有关文件或目录的信息或更改其某些属性。
指定文件的位置时,可以使用NSURL或NSString对象。通常优先使用NSURL类来指定文件系统项目,因为它们可以在内部将路径信息转换为更高效的表示。您也可以从NSURL对象获取书签,该书签类似于别名,并且提供了更确定的方式来查找文件或目录。
如果正在移动,复制,链接或删除文件或目录,则可以使用委托与文件管理器对象一起来管理这些操作。代表的作用是确认操作,并决定是否在发生错误时继续。在macOS 10.7及更高版本中,委托必须符合NSFileManagerDelegate协议。
NSStream是一个抽象基类,定义了所有流对象的基础接口和属性。NSInputStream和NSOutputStream继承自NSStream,实现了输入流和输出流的默认行为。下图描述了流的应用场景:
NSInputStream 对应的是读文件,所以要记住它是要将文件的内容读到内存(你声明的一段buffer)里,用于读取文件
NSOutputStream 对应的是写文件,它是要将已存在的内存(buffer)里的数据写入文件, 用于读取文件
网络请求类—URL
NSCachedURLResponse 是个包含 NSURLResponse 以及它对应的缓存中的 NSData 的类,对URL请求的缓存响应。
NSCachedURLResponse对象以NSURLResponse对象的形式提供服务器的响应元数据,以及包含实际缓存的内容数据的NSData对象。 它的存储策略决定了响应是应该缓存在磁盘,内存中还是根本不缓存。缓存的响应还包含用户信息字典,您可以在其中存储有关缓存项目的特定于应用程序的信息。
NSURLCache类存储和检索NSCachedURLResponse的实例。
NSURLCache 为您的应用的 URL 请求提供了内存中以及磁盘上的综合缓存机制。将URL请求映射到缓存的响应对象的对象。 作为基础类库 URL 加载系统 的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。
NSURLCache类通过将NSURLRequest对象映射到NSCachedURLResponse对象来实现对URL加载请求的响应缓存。 它提供了一个复合内存和磁盘缓存,并允许您操纵内存和磁盘部分的大小。 您还可以控制缓存数据持久存储的路径。网络缓存减少了需要向服务器发送请求的次数,同时也提升了离线或在低速网络中使用应用的体验。当一个请求完成下载来自服务器的回应,一个缓存的回应将在本地保存。下一次同一个请求再发起时,本地保存的回应就会马上返回,不需要连接服务器。NSURLCache 会 自动 且 透明 地返回回应。
在iOS中使用NSHTTPCookie类封装一条cookie,通过NSHTTPCookie的方法读取到cookie的通用属性。
NSHTTPCookieStorage
NSHTTPCookieStorage单件类提供了管理所有NSHTTPCookie对象的接口,在OS X里,cookie是在所有程序中共享的,而在iOS中,cookie只当当前应用中有效。
通过sharedHTTPCookieStorage方法可获取到共享的NSHTTPCookieStorage单件对象。
NSHTTPCookie 和NSHTTPCookieStorage
一个 NSURL 对象代表了一个表示远程服务器资源或者本地文件的 URL。所以在 iOS 的网络请求和操作文件系统的 API 中,很多都需要 NSURL 类型的参数。
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链验证中所述进行操作。
NSURLCache 为应用的 URL 请求提供了内存以及磁盘上的综合缓存机制,作为基础类库 URL 加载的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。将URL请求映射到缓存的响应对象的对象。
NSURLCache类通过将NSURLRequest对象映射到NSCachedURLResponse对象来实现对URL加载请求的响应缓存。 它提供了一个复合内存和磁盘缓存,并允许您操纵内存和磁盘部分的大小。 您还可以控制缓存数据持久存储的路径。
创一个NSURLCounection对象负责发送请求,建立客户端和服务器的连接发送数据给服务器,使您可以启动和停止URL请求。
NSURLConnection对象允许您通过提供URL请求对象来加载URL的内容。 NSURLConnection的接口是稀疏的,只提供控件来启动和取消URL请求的异步加载。 您在URL请求对象本身上执行大部分配置。
身份验证凭证,包含特定于凭证类型的身份验证信息以及要使用的持久性存储的类型(如果有)。web 服务可以在返回 http 响应时附带认证要求 challenge,作用是询问 http 请求的发起方是谁,这时发起方应提供正确的用户名和密码(即认证信息),然后 web 服务才会返回真正的 http 响应
URL加载系统支持三种类型的凭证:基于密码的用户凭证,基于证书的用户凭证和基于证书的服务器凭证(用于验证服务器的身份)。创建凭证时,可以指定将其用于单个请求,暂时保留(直到您的应用程序退出)或永久保存(在钥匙串中)。
管理身份验证凭证存储的对象。网络安全结合网络请求使用
一个异步下载资源并将数据保存到文件的对象。
NSURLDownload的接口提供了初始化下载,设置目标路径和取消加载请求的方法。
分配给此类的每个实例的委托对象应该实现由NSURLDownloadDelegate协议定义的方法。 这些方法为委托提供正在进行的异步下载的当前状态,并允许委托自定义URL加载过程。 这些委托方法在启动相关NSURLDownload对象的异步加载操作的线程上调用。
来确认用户访问的是安全的服务器。从一个需要验证的服务器请求资源,服务器或服务器上的区域,通常称为领域,需要身份验证。
保护空间定义了一系列匹配约束条件,用于确定应提供哪个凭证。 例如,如果请求为委托提供了请求客户端用户名和密码的NSURLAuthenticationChallenge对象,则应用程序应为挑战保护空间中指定的特定主机,端口,协议和领域提供正确的用户名和密码。
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看起来像是一个协议,但其实这是一个类,
NSURLRequest 是一个独立加载协议或URL方案的URL加载请求。
NSURLRequest封装了加载请求的两个基本数据元素:要加载的URL以及在实现时查询URL内容缓存时使用的策略。
NSMutableURLRequest 是一个独立于协议或URL方案的可变URL加载请求。
NSMutableURLRequest是NSURLRequest的一个子类,用于帮助开发人员发现为一系列URL加载请求改变一个请求对象,而不是为每个加载创建一个不可变的NSURLRequest对象。
NSURLResponse类中存放请求的回执信息,在发送网络请求时,如果请求成功,首先会接收到服务端的回执信息,直接开始接收具体的返回数据。
相关的NSHTTPURLResponse类是NSURLResponse的一个常用子类,其对象表示对HTTP URL加载请求的响应,并存储附加的协议特定信息(如响应头)。 每当你发出HTTP请求时,你得到的NSURLResponse对象实际上就是NSHTTPURLResponse类的一个实例。
NSHTTPURLResponse类是NSURLResponse的一个子类,它提供了访问特定于HTTP协议响应的信息的方法。 无论何时发出HTTP URL加载请求,从NSURLSession,NSURLConnection或NSURLDownload类获得的任何响应对象都是NSHTTPURLResponse类的实例。
//获得当前要下载文件的总大小(通过响应头得到)
NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
进程间通信----interprocess Communication
相关流程之间的单向沟通渠道。
NSPipe对象提供了一个面向对象的接口来访问管道。 NSPipe对象表示管道的两端,并通过管道进行通信。 管道是相关过程之间的单向沟通渠道; 一个进程写入数据,另一个进程读取数据。 通过管道的数据被缓冲; 缓冲区的大小由底层操作系统决定。 NSPipe是一个抽象类,是一个类集群的公共接口。
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是NSPort的一个子类,包含一个Mach端口,它是macOS中的基本通信端口。 NSMachPort只允许本地(在同一台机器上)通信。 伴随类NSSocketPort允许本地和远程分布式对象通信,但在本地情况下可能比NSMachPort更消耗资源。要有效地使用NSMachPort,您应该熟悉Mach端口,端口访问权限和Mach消息。
用于在连接之间传输对象代理(有时是对象本身)的编码器。一个NSPortCoder实例是被一个NSConnection对象创建和使用,永远不需要直接自己创建或使用一个。
NSPortCoder是分布式对象系统中NSCoder的一个具体子类,用于在NSConnection对象之间传输对象代理(有时是对象本身)。 ;
线程锁和线程----Locking Threading
条件锁,一个线程获得了锁,其它线程等待。
使用一个NSConditionLock对象,可以确保一个线程只有在满足某个条件时才能获得一个锁。 一旦获得了锁并执行了代码的关键部分,线程就可以放弃锁并将相关条件设置为新的东西。 条件本身是任意的:你根据需要为你的应用程序定义它们。
NSDistributedLock是MAC开发中的跨进程的分布式锁,底层是用文件系统实现的互斥锁。NSDistributedLock没有实现NSLocking协议,所以没有lock方法,取而代之的是非阻塞的tryLock方法。
锁由文件系统中的条目(如文件或目录)实现。 对于多个应用程序使用NSDistributedLock对象来协调其活动,该锁定必须在可以运行应用程序的所有主机可访问的文件系统上写入。
使用tryLock方法尝试获取一个锁。 您通常应该使用解锁方法来释放锁而不是breakLock。
NSDistributedLock不符合NSLocking协议,也没有锁定方法。 该协议的锁定方法旨在阻止线程的执行,直到成功。 对于NSDistributedLock对象,这可能意味着以某个预定的速率轮询文件系统。 更好的解决方案是提供tryLock方法,并让您确定对您的应用程序有意义的轮询频率。
NSLock锁 ,协调同一应用程序中多个执行线程的操作的对象。不能用于实现递归锁
NSLock对象可用于调解对应用程序全局数据的访问,或保护代码的关键部分,使其能够以原子方式运行。
注意:NSLock类使用POSIX线程来实现其锁定行为。 将解锁消息发送给NSLock对象时,必须确保该消息是从发送初始锁定消息的同一个线程发送的。 解锁来自不同线程的锁可能会导致未定义的行为。
你不应该使用这个类来实现一个递归锁。 在同一个线程上调用两次锁定方法会永久锁定线程。 使用NSRecursiveLock类来实现递归锁。
解锁未锁定的锁被视为程序员错误,应在代码中修复。 NSLock类通过向控制台发送错误消息来报告这些错误。
iOS平台提供更高级的并发(异步)调用接口,让你可以集中精力去设计需完成的任务代码,避免去写与程序逻辑无关的线程生成、运行等管理代码。当然实质上是这些接口隐含生成线程和管理线程的运行,从而更加简洁地实现多线程
NSBlockOperation用于管理一个或多个块的并发执行的操作。
NSBlockOperation类是NSOperation的一个具体子类,它管理一个或多个块的并发执行。 您可以使用此对象一次执行多个块,而无需为每个块创建单独的操作对象。 当执行多个块时,操作本身只有在所有块完成执行后才被认为是完成的。
添加到块操作的块将以默认优先级调度到适当的工作队列。 块本身不应该对其执行环境的配置做任何假设。
NSInvocationOperation用于管理指定为调用的单个封装任务的执行的操作。
NSInvocationOperation类是NSOperation的具体子类,用于启动一个操作,该操作包括调用指定对象上的选择器。 这个类实现了非并发操作。
NSBlockOperation和NSInvocationOperation
NSOperationQueue用于调节一组操作的执行的NSOperation加入到一个NSOperationQueue中去异步执行队列。
在被添加到操作队列之后,NSOperation实例将保留在该队列中,直到被明确取消或完成其任务。队列中的操作(但尚未执行)本身按照优先级和操作间对象依赖关系进行组织,并相应执行。应用程序可能会创建多个操作队列并将操作提交给其中的任何一个。
即使这些操作位于不同的操作队列中,操作间依赖也为操作提供绝对的执行顺序。操作对象不被视为准备好执行,直到所有依赖操作完成执行。对于准备执行的操作,操作队列总是执行相对于其他就绪操作具有最高优先级的操作队列。有关如何设置优先级别和依赖关系的详细信息
添加后,不能直接从队列中删除操作。操作保持在其队列中,直到它报告完成其任务。完成任务并不一定意味着操作完成任务。操作也可以取消。取消操作对象会将队列中的对象留在队列中,但会通知对象尽快中止其任务。对于当前正在执行的操作,这意味着操作对象的工作代码必须检查取消状态,停止正在执行的操作,并将自己标记为已完成。对于已排队但尚未执行的操作,队列仍必须调用操作对象的start方法,以便它可以处理取消事件并将其标记为已完成。
NSRecursiveLock实际上定义的是一个递归锁,这个锁可以被同一线程多次请求,而不会引起死锁。这主要是用在循环或递归操作中。
NSTask创建的是一个独立运行的进程,不会与主程序共享存储空间
使用NSTask类,您的程序可以将另一个程序作为子进程运行,并可以监视该程序的执行。 NSTask对象创建一个单独的可执行实体; 它与NSThread的区别在于它不会与创建它的进程共享内存空间。
进程在由当前值定义的几个项目的环境中运行:当前目录,标准输入,标准输出,标准错误以及任何环境变量的值。 默认情况下,NSTask对象从启动它的进程继承它的环境。 如果在过程中有任何值应该不同,例如,如果当前目录应该更改,则在启动它之前必须更改该值。 进程的环境在运行时不能改变。
一个NSTask对象只能运行一次。
注意:在沙盒应用程序中,使用NSTask类创建的子进程将继承父应用程序的沙箱。 您通常应该将帮助器应用程序编写为XPC Services,因为XPC Services允许您为帮助器应用程序指定不同的沙盒权利。
常用线程之一
当你想让Objective-C方法在自己的执行线程中运行时,使用这个类。 当需要执行冗长的任务时,线程特别有用,但不希望它阻塞应用程序其余部分的执行。 特别是,您可以使用线程来避免阻塞应用程序的主线程,主线程处理用户界面和与事件相关的操作。 线程也可以用来把一个大的工作分成几个较小的工作,这可能会导致多核计算机的性能提高。
NSThread类支持类似于NSOperation的语义来监视线程的运行时状态。 您可以使用这些语义来取消线程的执行或确定线程是否仍在执行或已经完成其任务。 取消线程需要来自线程代码的支持;
通知---- Notifications
过通知中心向所有注册观察员广播的信息容器。
NSNotification对象(称为通知)包含名称,对象和可选字典。该名称是标识通知的标签。该对象是通知的发布者想要发送给该通知的观察者的任何对象(通常是发布通知的对象)。字典存储其他相关的对象,如果有的话。 NSNotification对象是不可变的对象。
通知中心是整个通知机制的关键所在,它管理着监听者的注册和注销,通知的发送和接收。通知中心维护着一个通知的分发表,把所有通知发送者发送的通知,转发给对应的监听者们通知调度机制,可以向登记的观察员广播信息。
对象向通知中心注册,以使用addObserver:selector:name:object:或addObserverForName:object:queue:usingBlock:methods来接收通知(NSNotification对象)。 当一个对象自己添加为观察者时,它指定应该接收哪些通知。 因此一个对象可能会多次调用这个方法,以便注册自己作为几个不同通知的观察者。
每个正在运行的应用程序都有一个defaultCenter通知中心,您可以创建新的通知中心来组织特定情况下的通信。
通知中心只能在单个程序中发送通知; 如果要将通知发布到其他进程或从其他进程接收通知,请改为使用NSDistributedNotificationCenter。
每个任务都有一个缺省的分布式通告中心,您可以通过NSDistributedNotificationCenter的defaultCenter类方法来访问。这个分布式通告中心负责处理同一个机器的不通任务之间的通告。如果需要实现不同机器上的任务间通讯,请使用分布式对象。
鉴于通知中心在发布通知时分发通知,放入队列的通知可以被延迟,直到当前通过运行循环结束或者直到运行循环空闲。 重复的通知可以合并,以便只发送一个通知,尽管发布了多个通知。
通知队列以先进先出(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。这样就完成了异步的需求。
Objective-C语言服务---- Objective-c language Srevices
NSCoder数据储存作为对象的基础的抽象类,使其他对象能够存档和分发
NSCoder抽象类声明具体子类使用的接口在内存和其他格式之间传输对象和其他值。此功能为存档(对象和数据项存储在磁盘上)和分配(在不同进程或线程之间复制对象和数据项)提供了基础。由Foundation提供的具体子类是NSArchiver,NSUnarchiver,NSKeyedArchiver,NSKeyedUnarchiver和NSPortCoder。一般将NSCoder的具体子类称为编码器类,将这些类的实例称为编码器对象(或简称为编码器)。只能对值进行编码的编码器对象被称为编码器对象,并且只能将值解码为解码器对象。
NSCoder以对象,标量,C数组,结构和字符串以及指向这些类型的指针进行操作。它不处理实现在不同平台间变化的类型,例如union,void *,函数指针和长链指针。编码器对象将对象类型信息与数据一起存储,因此从字节流解码的对象通常与最初编码到流中的对象具有相同的类。然而,一个对象在编码时可以改变它的类。这在档案和序列编程指南中有描述。
AV Foundation框架将方法添加到NSCoder类中,以便于创建包括Core Media时间结构在内的存档,并从存档中提取Core Media时间结构
将对象的数据存储到存档的编码器。
NSArchiver是NSCoder的一个具体子类,它提供了一种将对象编码成可存储在文件中的与体系结构无关的格式。 归档对象图时,每个对象的类信息和实例变量都会写入归档。 伴随类NSUnarchiver对档案中的数据进行解码,并创建与原始组等价的对象图。
NSArchiver将归档数据存储在可变数据对象(NSMutableData)中。 在对对象进行编码之后,可以让NSArchiver对象立即将此可变数据对象写入文件,或者可以检索可变数据对象以供其他用途。
将对象的数据存储到一键值对引用的存档的编码器。NSKeyedArchiver是NSCoder的一个具体子类,它提供了一种将对象(和标量值)编码成可存储在文件中的与体系结构无关的格式。归档一组对象时,每个对象的类信息和实例变量都写入归档。伴随类NSKeyedUnarchiver解码档案中的数据,并创建一组等同于原始组的对象。
键控存档与非键控存档的不同之处在于,编码到存档中的所有对象和值都被赋予名称或键。解码非键控压缩文件时,必须按照与编码相同的顺序对值进行解码。当解码一个键控存档时,由于数值是按名称来请求的,所以数值可以不按顺序解码,也可以根本不解码。因此,密钥存档为前向和后向兼容提供了更好的支持。
赋予编码值的键只能在当前编码对象的范围内唯一。键控存档是分层的,因此对象A用于编码其实例变量的键不会与对象B使用的键冲突,即使A和B是同一类的实例。但是,在一个对象中,子类使用的键可能与其超类中使用的键相冲突
将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成。
Mac OS X从版本10.2开始支持带键的档案。在此之前,要使用NSArchiver类创建连续的(sequential)归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。
在带键的归档中,每个归档字段都有一个名称。归档某个对象时,会为它提供一个名称,即键。从归档中检索该对象时,是根据这个键来检索的。这样可以按照任意的顺序将对象写入归档并进行检索。另外,如果向类添加了新的实例变量或删除了实例变量,程序也可以进行处理。
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
NSUnarchiver类可以通过解码归档文件获得对象。从档案中恢复数据的解码器。
NSUnarchiver是NSCoder的一个具体子类,定义了从一个存档解码一组Objective-C对象的方法。 这样的档案由NSArchiver类的对象产生。
NSArchiver类和NSUnarchiver
NSPropertyListSerialization这个类提供了一些方法,专门用来转换不同组织形式的list对象.list对象包括了NSData, NSString, NSArray, NSDictionary, NSDate, 以及 NSNumber.
NSAssertionHandler实例是自动创建的,用于处理错误断言。断言宏,比如NSAssert和NSCAssert,用于评估一个条件,如果条件评估为错误,这个宏向NSAssertionHandler实例发送一个表示错误的字符串。每个线程都有它自己的NSAssertionHandler实例。断言处理程序调用的时候,会打印一条错误信息,包含断言的方法或类,并抛出一个NSInternalInconsistencyException。
自动释放池 :当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池 定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放
NSClassDescription用于查询类的关系和属性的接口的抽象类。
NSClassDescription的具体子类提供了特定类的对象的可用属性以及该类与其他类之间的关系。定义类之间的这些关系允许使用键值编码更智能和灵活地处理对象。
需要注意的是,默认情况下没有类描述。要在你的代码中使用NSClassDescription对象,你必须为你的模型类实现它们。对于所有具体的子类,您必须为NSClassDescription的所有实例方法提供实现。 (NSClassDescription只提供维护已注册类描述缓存的类方法的实现。)创建后,必须使用NSClassDescription方法registerClassDescription:forClass:注册类描述。
您可以在由诸如attributeKeys和toManyRelationshipKeys等方法返回的数组中使用NSString对象来访问(使用键值编码)类描述对象所对应类的实例的属性。有关属性和关系的更多信息,请参阅Cocoa基础知识指南。有关键值编码的更多信息,请参阅键值编码编程指南。
用于映射可编写脚本类之间关系的NSScriptClassDescription是作为Cocoa框架的一部分提供的NSClassDescription的唯一具体子类。
控制台输出的日志信息就是NSException产生的,一旦程序抛出异常,程序就会崩溃,控制台就会有这些崩溃日志。
最熟悉的陌生类 强大的令人窒息 感谢作者让我知道了这个家伙
在消息转发中提到过NSInvocation这个类,这里说一下我所理解的NSInvocation。NSInvocation 是命令模式的一种实现,它包含选择器、方法签名、相应的参数以及目标对象。所谓的方法签名,即方法所对应的返回值类型和参数类型。当NSInvocation被调用,它会在运行时通过目标对象去寻找对应的方法,从而确保唯一性,可以用[receiver message]来解释。实际开发过程中直接创建NSInvocation的情况不多见,这些事情通常交给系统来做
很六的类
NSMethodSignature顾名思义应该就是“方法签名”,类似于C++中的编译器时的函数签名。
官方定义该类为对方法的参数、返回类似进行封装,协同NSInvocation实现消息转发。
NSUndoManager允许记录用户执行的操作并且反转这类操作。
当你调用一个可以改变一些东西的方法或者是执行一个改变属性值的动作(例如 setter 方法)时,你可以注册这个操作来进行撤销。
一个撤销操作包含了接收消息的对象,发送消息以及参数 - 通常你会传入原始值。
NSUndoManager实例支持重做操作,所以才能逆转操作。你可以认为这个管理器拥有两个栈。实际上,它管理两个栈,undo(撤销)栈和redo(重做)栈 - 对应NSUndoManager的私有属性_undoStack和_redoStack,里面存储着一些操作。