美文网首页iOS移动开发
iOS Foundation 框架简介(上)

iOS Foundation 框架简介(上)

作者: zysmoon | 来源:发表于2017-12-01 15:10 被阅读0次

    站在前辈的肩膀上前行

    UIKit框架和Foundation框架

    011901266024074.jpg

    所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象都是NSObject,NSObject就处在Foundation框架之中

    Foundation框架大致内容

    011902445406430.jpg 011902458525930.jpg 011903203057004.jpg

    值对象---Value

    • NSAffineTransform

    一个图形坐标变换
    转换指定一个坐标系中的点如何转换为另一个坐标系中的点。 仿射变换是一种特殊类型的变换,保留路径中的平行线,但不一定保留长度或角度。 缩放,旋转和平移是仿射变换支持的最常用的操作,但剪切也是可能的。

    • NSCalendar

    日历类 定义日历(如年代,年和时区时间)与绝对时间点之间关系的对象,提供用于计算和比较日期的功能。
    NSCalendar对象封装了定义一年的开始,长度和分区的计算系统的信息。 他们提供有关日历的信息,并支持日历计算,例如确定给定日历单位的范围,并将单位添加到给定的绝对时间。

    • NSCache

    SD图片缓存就用的该类 一个可变集合,用于临时存储临时键值对,在资源不足的情况下被释放。
    NSCache类包含了各种自动释放内存的机制,可以确保缓存不会占用太多的系统内存。如果其他应用程序需要内存,这些机制会从缓存中删除一些项目,从而最大限度地减少其内存占用。
    您可以从不同的线程中添加,删除和查询缓存中的项目,而无需自己锁定缓存。
    与NSMutableDictionary对象不同,缓存不会复制放入其中的关键对象。
    您通常使用NSCache对象临时存储对象与创建重要的临时数据。重用这些对象可以提供性能优势,因为它们的值不必重新计算。但是,这些对象对应用程序并不重要,如果内存不足,可以将其释放。如果释放,则需要时重新计算它们的值。
    具有可以在不使用时释放的子组件的对象可以采用NSDiscardableContent协议来改善缓存机制的行为。默认情况下,如果缓存中的NSDiscardableContent对象的内容被释放,它们将被自动删除,尽管这个自动删除机制是可以改变的。如果一个NSDiscardableContent对象被放入缓存中,缓存在移除时调用discardContentIfPossible。

    • NSData

    NSData,数据,内存中的静态字节缓冲区,当我们需要把一些信息写入到文件里或发送到网络上,我们需要把这些数据转换下,变成纯粹的0、1字符流。也就是网络中要传数据的的时候,我们通常会用相应的NSData的数据来进行存储。。

    • NSMutableData

    NSMutableData,数据 内存中表示动态字节缓冲区的对象。当我们需要把一些信息写入到文件里或发送到网络上,我们需要把这些数据转换下,变成纯粹的0、1字符流。也就是网络中要传数据的的时候,我们通常会用相应的NSData的数据来进行存储。。

    NSMutableData及其超类NSData为字节缓冲区提供数据对象或面向对象的包装器。 数据对象让简单分配的缓冲区(也就是没有嵌入式指针的数据)承担基础对象的行为。 它们通常用于数据存储,而且在分布式对象应用程序中也很有用,其中包含在数据对象中的数据可以在应用程序之间复制或移动。 NSData创建静态数据对象,NSMutableData创建动态数据对象。 您可以轻松地将一种类型的数据对象转换为另一种类型的数据对象,并将NSData对象或NSMutableData对象作为参数。

    • NSPurgeableData

    包含字节的可变数据对象,不再需要时可以将其释放。
    NSPurgeableData对象继承自其超类NSMutableData的创建方法,同时提供NSDiscardableContent协议的默认实现。
    所有NSPurgeableData对象开始“访问”,以确保它们不会立丢弃即被释放。beginContentAccess方法将对象的字节标记为“被访问”,从而防止它们被释放,并且在访问对象之前必须被调用,否则将会出现异常如果字节没有被释放,并且被成功标记为“被访问”,这个方法返回YES,任何直接或间接访问这些字节的方法或者它们在不被“访问”的时候都会产生一个异常。你使用完成了数据,调用endContentAccess来允许它们被释放,以便快速释放内存。
    您可以自己使用这些对象,并且不一定必须将它们与NSCache结合使用才能获得清除行为。 NSCache类整合了一些缓存机制和一些自动删除机制,以确保其内存占用不会太大。
    不应将NSPurgeableData对象用作基于哈希的集合中的键,因为字节指针的值在每次数据变化之后都会更改。

    • NSDate

    获取日期(例如获取当前手机上的时间 但是获取不了日历等) 特定时间点的表示,与任何日历或时区无关。

    NSDate对象封装了一个时间点,与任何特定的日历系统或时区无关。 日期对象是不可变的,表示相对于绝对引用日期(2001年1月1日00:00:00 UTC)的不变时间间隔。
    NSDate类提供了比较日期的方法,计算两个日期之间的时间间隔,并从相对于另一个日期的时间间隔创建一个新的日期。 NSDate对象可以与NSDateFormatter对象一起使用来创建日期和时间的本地化表示,以及使用NSCalendar对象执行日历算术。

    • NSCalemdarDate (被弃用改为NSCalendar)

    被弃用改为NSCalendar

    • NSDateComponents

    NSDateComponents是一个与日期有关的类,但这个类具体是干吗的呢?我们现从字面上的意思来理解。Components就是零件、组件的意思,其实这个类的作用就是把日期拆分成一个一个的组件。一个日期是有年月日时分秒组成的,components这个类的作用就是把日期拆分成单独的年、月、日、时、分、秒。提供用于计算和比较日期的功能。
    NSDateComponents以可扩展的,面向对象的方式封装日期的组件。 它用于通过提供组成日期和时间的时间组件来指定日期:小时,分钟,秒,日,月,年等。 您也可以使用它来指定持续时间,例如5小时16分钟。 NSDateComponents对象不需要定义所有组件字段。 当创建NSDateComponents的新实例时,日期组件被设置为NSDateComponentUndefined。

    • NSDecimalNumberHandler

    对比NSDecimalNumber该类可以精确控制保留小数位数 采用十进制数行为协议的类。
    这个类允许你设置一个NSDecimalNumber对象取整的方式并处理错误,而不必创建一个自定义的类。
    你可以使用这个类的一个实例作为任何以...行为结束的NSDecimalNumber方法的参数。 如果你不认为你需要特殊的行为,你可能不需要这个类 - 它很可能是NSDecimalNumber的默认行为将适合您的需要。

    NSDecimalNumber和NSDecimalNumberHandler 区别
    参考例子:http://blog.csdn.net/wangyanchang21/article/details/50981829

    NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain    
                       scale:2
                        raiseOnExactness:NO
                         raiseOnOverflow:NO
                        raiseOnUnderflow:NO
                     raiseOnDivideByZero:NO];  //保留2位小数
    scale: 小数点后保留的位数 
    RoundingMode: 小数保留的类型 
    根据官方文档说明, 枚举值分析: 
    NSRoundPlain, 四舍五入 
    NSRoundDown, 只舍不入 
    NSRoundUp, 只入不舍 
    NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
    
    • NSLocale

    类返回本地化信息,主要体现在"语言"和"区域格式"这两个设置项

    您通常使用语言环境来格式化和解释关于用户的习惯和偏好的信息。您可以使用initWithLocaleIdentifier初始化任意数量的区域设置实例:使用availableLocaleIdentifiers数组中找到的某个区域设置标识符。 但是,您通常使用配置为匹配当前用户的首选项的区域设置。使用currentLocale属性获取与当前用户首选项匹配的区域设置。 如果您需要在用户更改区域设置时收到警报,请注册NSCurrentLocaleDidChangeNotification通知。 或者,您可以使用autoupdatingCurrentLocale属性来获取一个使用用户的配置设置自动更新的区域

    用法完美解释:http://www.jianshu.com/p/5e40363152b1

    • NSNull

    Objective-C是C的一个超集,主要引入了OO的设计理念。所以,Objective-C不可避免地使用指针以及指针变量来描述一个对象的内存地址。那么,既然存在指针这种东西,当然就允许存在NULL指针,也就是空指针。
    另外,Objective-C主要定义了两种容器:NSArray和NSDictionary,并且规定了这两种容器中都不能放置nil指针,只能存放NSObject对象。那么就存在有些场景确实需要存nil指针,可能是出于保证count的正确性的目的。所以,在需要存放nil指针的位置就存放了NSNull对象,用来表示空对象,除此之外无任何实际意义。这也就是为什么Cocoa需要设计NSNull的原因。

    参考:https://www.cnblogs.com/CoderPlace/p/4411589.html

    • NSTimeZone

    表示时区信息 包含与特定国家区域相关的标准时间约定信息的对象。
    和时间相关的最重要的一个因素, 因为各个地区的时区都不一样, 所以时间的差别是很大的, 这就是所谓的时差 时区国家区域划分。因此,这些对象具有这些区域的名称。时区对象还表示格林尼治标准时间(GMT)和缩写(例如太平洋标准时间的PST)的时间偏移量,加号或减号。

    参考:http://www.jianshu.com/p/5f4e7fabcc02 解释了 NSTimeZone和NSDate的区别

    NSValue
    一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一直是不可枚举的

    参考:http://blog.sina.com.cn/s/blog_bf9843bf0101ehs1.html 很全

    • NSNumber

    NSNumber:专门用来装基础类型的对象,把整型、单精度、双精度、字符型等基础类型存储为对象
    NSArray\NSDictionary中只能存放OC对象, 不能存放int\float\double等基本数据类
    如果真想把基本数据(比如int)放进数组或字典中, 需要先将基本数据类型包装成OC对象,把 int /float /double -----> 包装成一个对象
    参考:https://www.cnblogs.com/GISerYang/p/3340764.html

    • NSDecimalNumber

    NSDecimalNumber是NSNumber的不可变子类。苹果针对浮点型计算时存在精度计算误差的问题而提供的一个计算类,它是基于10进制的定点计算保证了精度不会缺失。同时也可以定制精度的取正类型:向上取正、向下去正、四舍五入等。相对与浮点类型的计算,NSDecimalNumber提供了更加精准的计算。

    参考http://blog.csdn.net/yuwuchaio/article/details/53080645

    • NSValueTransformer

    主要用于数据类型的变换(如Model?View等),变换可以是单向或双向的。NSValueTransformer是一个抽象类,所有的类型变换都在NSValueTransformer的子类中定义

    通过继承NSValueTransformer并重写必要的方法来创建一个值转换器,以提供所需的自定义转换。然后使用setValueTransformer:forName:方法注册值转换器,以便应用程序的其他部分可以通过名称valueTransformerForName:来访问它。
    使用transformedValue:方法将值从一种表示转换为另一种表示。如果值转换器通过为allowReverseTransformation返回YES来指定其转换是可逆的,则还可以使用reverseTransformedValue:以相反方式执行转换。例如,反转字符串中的字符是可逆操作,而将字符串中的字符更改为大写字符是不可逆的操作。
    值转换器可以接受一种类型的输入并返回不同类型的值。例如,一个值转换器可以带一个NSImage或UIImage对象,并返回一个包含该图像的PNG表示的NSData对象。

    参考http://blog.csdn.net/oqqquzi1234567/article/details/43020173

    MXL解析-----XML

    • NSXMLparser

    NSXMLParser是事件驱动的XML文档解析器 NSXMLParser采取的是SAX方式解析,特点是事件驱动,当扫描到文档和元素都会通知代理

    NSXMLParser通知其委托关于在处理XML文档时遇到的项目(元素,属性,CDATA块,注释等)。 除了报告之外,它本身不会对这些解析的项目做任何事情。 它也报告解析错误。 为了方便起见,以下描述中的NSXMLParser对象有时被称为解析器对象。 除非在回调中使用,否则NSXMLParser是一个线程安全的类,只要任何给定的实例只在一个线程中使用。

    参考 http://www.jianshu.com/p/4aeb8dc55c11

    字符串------Strings

    • NSCharacterSet

    NSCharacterSet类似一个字符串处理工具类 表示用于搜索操作的一组固定Unicode字符值的对象。

    NSCharacterSet对象表示一组符合Unicode的字符。 NSString和NSScanner对象使用NSCharacterSet对象将字符组织在一起进行搜索操作,以便在搜索过程中可以找到任何特定的字符集。集群的两个公共类NSCharacterSet和NSMutableCharacterSet分别声明静态和动态字符集的编程接口。
    使用这些类创建的对象被称为字符集对象(并且不会导致混淆,仅作为字符集)。由于类簇的性质,字符集对象不是NSCharacterSet或NSMutableCharacterSet类的实际实例,而是其私有子类之一的实际实例。虽然字符集对象的类是私有的,但是它的接口是公共的,如这些抽象超类NSCharacterSet和NSMutableCharacterSet所声明的。字符集类采用NSCopying和NSMutableCopying协议,方便将一种字符集转换为另一种字符集。

    参考http://www.jianshu.com/p/5fb58dc73e7b

    • NSMutableCharacterSet

    NSMutableCharacterSet类似一个字符串处理工具类表示用于搜索操作的可变Unicode字符值集合的对象。
    NSMutableCharacterSet类声明编程接口来管理一组可修改的Unicode字符的对象。 您可以添加或删除可变字符集中的字符作为NSRange结构中的数字值,或者作为字符串中的字符值,通过联合或交叉组合字符集并反转字符集。
    可变字符集的使用效率低于不可变字符集。 如果创建后不需要更改字符集,请使用copy创建一个不可变的副本。
    NSMutableCharacterSet没有定义原始方法。 除了NSCharacterSet的原语之外,子类必须实现由这个类声明的所有方法。 他们还必须实现mutableCopyWithZone :

    NSCharacterSet和 NSMutableCharacterSet的部分区别
    参考:http://blog.csdn.net/lcl130/article/details/41802623

    • NSString

    一个静态的纯文本Unicode字符串对象。
    NSString类及其可变子类NSMutableString提供了一组用于处理字符串的API,包括用于比较,搜索和修改字符串的方法。 NSString对象用于整个Foundation和其他Cocoa框架,作为平台上所有文本和语言功能的基础。
    常用方法:http://blog.csdn.net/tt5267621/article/details/7670515

    • NSMutableString

    一个动态的纯文本Unicode字符串对象。

    NSMutableString类声明编程接口到一个对象,该对象管理一个可变字符串,也就是说,一个字符串的内容可以被编辑,它在概念上代表一个Unicode字符数组。 为了构造和管理一个不可变的字符串,或者是一个在创建后不能改变的字符串,可以使用NSString类的一个对象。
    NSMutableString类为从NSString继承的基本字符串处理行为添加一个基本方法replaceCharactersInRange:withString:。 所有其他修改字符串的方法都通过这个方法来工作。 例如,insertString:atIndex:简单地替换0长度范围内的字符,而deleteCharactersInRange:替换给定范围内不带字符的字符。

    NSString和NSMutableString
    常用方法:http://seven-sally.lofter.com/post/19d861_500373

    • NSFormatter

    一个抽象类,为创建,解释和验证值的文本表示形式的对象声明一个接口。

    NSFormatter是用于子类化的。 自定义格式化程序可以限制输入并以新颖的方式增强数据的显示。 例如,您可以使用自定义格式器,以确保用户输入的序列号符合预定义的格式。 在决定创建自定义格式器之前,请确保您不能配置公共子类来满足您的要求。

    • NSDateFormatter

    NSDateFormatter是系统提供的一个用于时间格式化的类,用于在日期和文本表示之间进行转换,可是每次创建这个类的来做时间转换的消耗却是很大的,这个时候就需要程序猿来进行优化.
    NSDateFormatter的实例创建NSDate对象的字符串表示,并将日期和时间的文本表示转换为NSDate对象。 对于用户可见的日期和时间表示,NSDateFormatter提供了各种本地化的预设和配置选项。 对于日期和时间的固定格式表示,您可以指定自定义格式字符串。

    参考:http://www.jianshu.com/p/3efece422336

    • NSNumBerFormatter

    NSDateFormatter是系统提供的一个用于在数值和文本表示之间进行转换。
    NSNumberFormatter的实例格式化包含NSNumber对象的单元格的文本表示形式,并将数字值的文本表示形式转换为NSNumber对象。 该表示包含整数,浮点数和双精度; 浮动和双打可以格式化到指定的小数位。 NSNumberFormatter对象也可以在单元格可以接受的数值上施加范围。

    参考:http://www.jianshu.com/p/29ef372c65d3

    • NSScanner

    该类为一个从字符串中扫描值的类簇的抽象超类。

    NSScanner对象将NSString对象的字符解释并转换为数字和字符串值。您在创建扫描仪时指定扫描仪的字符串,当您请求时,扫描仪从头到尾遍历该字符串的字符。
    由于类簇的性质,扫描器对象不是NSScanner类的实际实例,而是其私有子类之一。尽管扫描器对象的类是私有的,但它的接口是公共的,正如这个抽象超类NSScanner所声明的那样。 NSScanner的原始方法是NSScanner和配置扫描器下列出的所有方法。你使用这个类创建的对象被称为扫描器对象(当不会造成混淆,只是作为扫描器)。
    您可以将NSScanner对象设置为在使用charactersToBeSkipped属性扫描字符串时忽略一组字符。扫描目标之前跳过跳过集中的字符。要跳过的默认字符集是空格和换行字符集。

    参考http://www.jianshu.com/p/a0ee15f94131

    • NSSortDescriptor

    NSSortDescriptor是用来指定排序规则, 对集合等进行排序时指定结果的排序规则生产不可变对象。
    您可以通过指定要比较的属性的key和排序顺序(升序或降序)来构造NSSortDescriptor的实例。 或者,您也可以指定一个选择器来执行比较,它允许您指定其他比较选择器,例如localizedStandardCompare:和localizedCaseInsensitiveCompare :. 如果要排序的对象不响应排序描述符的比较选择器,则排序引发异常。

    参考:http://www.jianshu.com/p/3e9f0884be6b

    集合类----- Collections

    • NSArray

    NSArray对象的静态有序集合只能够存贮OC对象。
    NSArray及其子类NSMutableArray管理被称为数组的对象的有序集合。 NSArray创建静态数组,NSMutableArray创建动态数组。 当需要对象的有序集合时,可以使用数组。

    参考http://www.jianshu.com/p/c8caa30afd9d

    • NSMutableArray

    NSMutableArray对象的动态有序集合。
    NSMutableArray类将编程接口声明为管理可修改对象数组的对象。 该类将插入和删除操作添加到从NSArray继承的基本数组处理行为。

    NSMutableArray和NSArray
    常用用法:http://blog.sina.com.cn/s/blog_65de545001016vpj.html

    • NSDictionary

    NSDictionary是一个无序的静态集合,也可称之为键值对。与数组不同的是字典可以通过特定的key快速查找到想要的值,而不用遍历字典。所以一个唯一的key只能对应一个值,而多个key可以对应同一个值。

    NSDictionary类将编程接口声明为管理键和值的不可变关联的对象。当你需要一个方便有效的方法来检索与任意键相关的数据时,使用这个类或它的子类NSMutableDictionary。 NSDictionary创建静态字典,NSMutableDictionary创建动态字典。 (为了方便起见,术语词典指的是这些类中的一个类的任何实例,而没有指定其确切的类成员资格。)
    字典中的键值对称为条目。每个条目由代表键的一个对象和作为该键的值的第二个对象组成。在字典中,密钥是唯一的。也就是说,单个字典中没有两个密钥是相等的(由isEqual确定:)。一般来说,一个键可以是任何对象(只要它符合NSCopying协议,见下文),但是请注意,使用键值编码时,键必须是一个字符串(请参阅访问对象属性)。无论是键还是值都不为零。如果您需要在字典中表示空值,则应该使用NSNull。

    参考http://blog.csdn.net/qq244596/article/details/50687680

    • NSMutableDictionary

    NSMutableDictionary是一个无序的动态集合,也可称之为键值对。与数组不同的是字典可以通过特定的key快速查找到想要的值,而不用遍历字典。所以一个唯一的key只能对应一个值,而多个key可以对应同一个值。
    NSMutableDictionary类将编程接口声明为管理键和值的可变关联的对象。 它将修改操作添加到从NSDictionary继承的基本操作。

    NSDictionary 和 NSMutableDictionary
    基本用法:http://www.jianshu.com/p/5b1370dd83be

    • NSEnumerator

    一个抽象类,其子类枚举对象的集合 依附于集合类(NSArray,NSSet,NSDictionary),没有用来创建实例的接口 对可变数组进行枚举操作时,不能通过添加或删除对象这类方式来改变数组容器。

    所有创建方法都是​​在集合类中定义的,例如NSArray,NSSet和NSDictionary,它们提供了特殊的NSEnumerator对象来枚举它们的内容。例如,NSArray有两个方法返回一个NSEnumerator对象:objectEnumerator和reverseObjectEnumerator。 NSDictionary也有两个方法返回一个NSEnumerator对象:keyEnumerator和objectEnumerator。这些方法允许您分别按键或值枚举字典的内容。
    您将nextObject重复发送到新创建的NSEnumerator对象,以使其返回原始集合中的下一个对象。当收集用完时,返回nil。枚举器用尽后,不能“重置”它。要再次枚举集合,您需要一个新的枚举器。

    参考:http://blog.csdn.net/at9009/article/details/7863036

    • NSDirectoryEnumerator

    NSDirectoryEnumerator,目录枚举类,一个NSDirectoryEnumerator对象列举了一个目录的内容,返回的所有文件在目录中的路径名,在该目录中。这些路径是相对于目录而言的

    参考:http://blog.csdn.net/u012519228/article/details/49451515

    • NSIndexPath

    索引路径
    在列表中表示嵌套数组树中特定位置的路径。索引路径中的每个索引都表示从列表中的一个节点到另一个更深的节点的子数组索引。

    Unknown.gif

    参考 :http://www.jianshu.com/p/64b68036117d

    • NSIndexSet

    NSIndexSet类代表一个不可变的独特的无符号整数的集合,表示另一个集合中索引的唯一整数值​​的不可变集合。称为索引,因为使用它们的方式。这个集合被称为索引集。你不应该使用索引集存储任意集合的整数值,因为索引集按索引排序范围的方式存储的。这使得它们更有效率比存储单个整数的集合。这也意味着每个索引值指数中只能出现一次。通俗点讲NSIndexSet就是一个唯一的,有序的,无符号整数

    NSIndexSet类表示一个唯一无符号整数的不可变集合,因为它们被使用的方式而被称为索引。这个集合被称为索引集。索引必须在范围0 .. NSNotFound - 1。
    您可以在代码中使用索引集来将索引存储到其他数据结构中。例如,给定一个NSArray对象,可以使用索引集来标识该数组中的对象的子集。
    您不应使用索引集来存储任意整数值的集合,因为索引集将索引存储为已排序的范围。这使得它们比存储单个整数集合更有效率。这也意味着每个索引值只能在索引集中出现一次。
    NSIndexSet类的指定初始值为:init,initWithIndexesInRange:和initWithIndexSet :.

    NSIndexSet和 NSMutableIndexSet
    参考:http://www.jianshu.com/p/84a1d5296844

    • NSMutableIndexSet

    NSMutableIndexSet类代表一个可变的独特的无符号整数的集合,类代表一个可变的独特的无符号整数的集合

    NSMutableIndexSet类表示一个唯一无符号整数的可变集合,因为它们被使用的方式而被称为索引。 这个集合被称为可变索引集。 有效索引的包含范围是0 ...(NSNotFound - 1); 试图使用这个范围以外的索引是无效的。
    可变索引集中的值总是排序的,所以添加值的顺序是不相关的。

    NSIndexSet和 NSMutableIndexSet
    参考:http://www.jianshu.com/p/84a1d5296844

    • NSSet

    集合:一个静态无序的唯一对象集合。 集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址;不过NSArray是有序的集合,NSSet是无序的集合。集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。存储的所有对象只能有唯一一个,不能重复。

    NSSet 和 NSMutableSet
    参考:https://www.cnblogs.com/TianHero/p/5101502.html

    • NSMutableSet

    集合:一个可变无序的唯一对象集合。 集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址;不过NSArray是有序的集合,NSSet是无序的集合。集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。存储的所有对象只能有唯一一个,不能重复。

    NSSet 和 NSMutableSet
    参考:https://www.cnblogs.com/TianHero/p/5101502.html

    • NSCountedSet

    将一个或多个属性或关系设置为一个或多个值的命令。
    NSCountedSet对象的每个不同的对象都有一个与之相关的计数器当对象相同的时候计数器就会加1

    参考:http://blog.csdn.net/liu1039950258/article/details/48153283

    谓词---Predicates

    NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索。
    可以使用谓词来表示逻辑条件,用于描述对象持久性存储在内存中的对象过滤。其实意思就是:我是一个过滤器,不符合条件的都滚开。

    • NSExpression

    NSExpression用于表示谓词表达式。比较操作在一个NSPredicate基于两个表达式,由NSExpression类的实例。表达式创建常量值,关键路径,等等
    NSPredicate中的比较操作基于两个表达式,如NSExpression类的实例所示。 表达式是为常量值,键路径等创建的。
    通常,NSExpression类层次结构中任何地方都有复合API和子类型,它们只能合理地响应该API的一个子集,调用一个对该子类型没有意义的方法将导致异常被抛出。

    参考:http://www.jianshu.com/p/3057adf8e7de

    • NSPredicate

    NSPredicate是一个Foundation类,它指定数据被获取或者过滤的方式。它的查询语言就像SQL的WHERE和正则表达式的交叉一样,提供了具有表现力的,自然语言界面来定义一个集合被搜寻的逻辑条件。

    NSPredicate 和 NSComparisonPredicate
    参考:http://nshipster.cn/nspredicate/

    • NSComparisonPredicate

    一个专门用于比较表达式的谓词。
    您可以使用比较谓词来比较两个表达式的结果。 您可以使用运算符,左表达式和右表达式创建比较谓词。 您使用NSExpression类的实例来表示表达式。 当您评估谓词时,它将以BOOL值的形式返回运算符与评估表达式结果的结果。

    NSPredicate 和 NSComparisonPredicate
    参考:http://nshipster.cn/nspredicate/

    • NSCompoundPredicate (不是太理解看到的大神给出指示)

    一个专门的谓词,用于评估其他谓词的逻辑组合。
    使用NSCompoundPredicate创建零个或多个其他谓词的属性或OR复合谓词,或者创建一个谓词的NOT。 对于逻辑属性和OR操作:一个AND谓词没有subpredicates评估为YES。没有子预测的OR谓词评估为NO。具有一个或多个子类的复合谓词评估其子类的真相。

    操作系统服务类---Operating-System Services

    • NSError

    获取系统的错误信息.系统有关错误情况的信息,包括域,域特定的错误代码和特定于应用程序的信息。

    参考:http://www.jianshu.com/p/643b4be1ca52

    • NSHost

    网络上单个主机的表示。主机域名

    NSHost类提供访问主机的网络名称和地址信息的方法。 NSHost类的实例表示网络上的单个主机。使用NSHost对象获取当前主机的名称和地址,并按名称或地址查找其他主机。

    要创建NSHost对象,请使用currentHost,hostWithAddress:或hostWithName:类方法(不要使用alloc和init)。这些方法使用可用的网络管理服务来发现所请求主机的所有名称和地址。但是,他们不会尝试联系主机本身。这种方法避免了由于主机不可用而导致的不合时宜的延迟,但是可能导致关于主机的信息不完整。

    NSHost对象包含网络管理服务为给定主机发现的所有网络地址和名称。每个NSHost对象可能包含多个地址,并且有多个名称。如果NSHost对象具有多个名称,则其他名称是同名的变体,通常是基本主机名加上完全限定的域名。

    • NSNetService

    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

    NSNetServiceBrowser用于监听查询网络上的 service,使用多播DNS在网络上查找已发布的service。
    服务范围可以从标准服务(如HTTP和FTP)到由其他应用程序定义的定制服务。您可以在代码中使用网络服务浏览器来获取可访问域的列表,然后为每个发现的服务获取NSNetService对象。每个网络服务浏览器一次执行一个搜索,因此如果要执行多个同时搜索,请使用多个网络服务浏览器。
    网络服务浏览器使用当前运行循环异步执行所有搜索,以在后台执行搜索。搜索结果将通过客户端应用程序必须提供的关联委托对象返回。搜索在后台进行,直到对象收到停止消息。

    NSNetService 和NSNetServiceBrowser区别
    参考:https://www.cnblogs.com/Mr-Ygs/p/5623422.html
    比较通俗较容易理解:http://blog.csdn.net/mamong/article/details/39781117

    • NSOrthography

    描述通常用于拼写和语法检查的一段文本的语言内容。
    一个NSOrthography实例描述:
    文本包含哪些脚本
    一个主导语言,可能还有其他语言的每个脚本。
    作为整体文本的统治脚本和语言。
    脚本统一由标准的四字母标签(Latn,Grek,Cyrl等)来描述,其中Jpan和Kore标签通常用于日文和韩文文本,Hans和Hant用于中文文本; 如果特定脚本不能识别,则使用标签Zyyy。 有关国际化的更多信息,请参阅“国际化和本地化指南”。
    语言由BCP-47标签统一描述,最好以规范的形式表示; 如果无法确定特定的语言,则使用标签和标签。

    • NSProcessInfo

    关于当前进程的信息的集合。
    每个进程都有一个共享的NSProcessInfo对象,称为进程信息代理。进程信息代理可以返回参数,环境变量,主机名和进程名等信息。 processInfo类方法返回当前进程的共享代理 - 也就是对象发送消息的进程。

    参考:http://blog.csdn.net/terrysg/article/details/50229517

    • NSRunLoop

    管理输入源的对象的编程接口。
    NSRunLoop对象处理来自窗口系统的鼠标和键盘事件,NSPort对象和NSConnection对象的输入。 一个NSRunLoop对象也处理NSTimer事件。您的应用程序既不创建也不显式管理NSRunLoop对象。 每个NSThread对象(包括应用程序的主线程)都根据需要自动创建一个NSRunLoop对象。 如果您需要访问当前线程的运行循环,则可以使用类方法currentRunLoop进行操作。

    参考:http://www.jianshu.com/p/296f182c8faaNSRunLoop

    • NSTextCheckingResult

    NSTextCheckingResult类的子类,主要用于检测半结构化的数据:日期,地址,电话号码,正则表达式等等。
    NSTextCheckingResult的实例由NSRegularExpression类和NSDataDetector类返回,检测内容的。 在这些情况下,找到的可能是正则表达式或日期,地址,电话号码等的匹配。

    子类NSDataDetector和NSTextCheckingResult的使用
    参考:http://blog.csdn.net/lcl130/article/details/41940861

    • NSTimer

    计时器在经过一段时间后触发,并将指定的消息发送到目标对象。
    定时器与运行循环一起工作。 运行循环保持对定时器的强引用,因此,在将定时器添加到运行循环后,您不必维护自己对定时器的强引
    计时器不是一个实时机制。 如果在长时间循环调用期间发生定时器的触发时间,或者运行循环处于未监视定时器的模式,定时器将在下次运行循环检查定时器时才触发。 因此,计时器触发的实际时间会显着延迟

    参考:http://www.jianshu.com/p/3ccdda0679c1

    • NSUserDefaults

    用户默认数据库的接口,也可以在给定设备上跨应用程序的调用持久地存储键/值对。

    NSUserDefaults类提供了一个编程接口来与默认系统进行交互。默认系统允许应用程序自定义其行为以匹配用户的偏好。例如,您可以允许用户确定应用程序显示的测量单位或文档自动保存的频率。应用程序通过将值分配给用户默认数据库中的一组参数来记录此类偏好。这些参数被称为默认值,因为它们通常用于确定应用程序在启动时的默认状态或默认情况下的默认状态。
    在运行时,您可以使用NSUserDefaults对象来读取应用程序在用户的默认数据库中使用的默认值。 NSUserDefaults缓存信息以避免每次需要默认值时打开用户的默认数据库。同步方法会按周期自动调用,使内存中的缓存与用户的默认数据库保持同步。
    NSUserDefaults类提供了访问常见类型(如浮点数,双精度,整数,布尔值和URL)的便捷方法。一个默认对象必须是一个属性列表 - 也就是,一个实例(或集合,实例的组合):NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果要存储任何其他类型的对象,则通常应将其存档以创建NSData的实例。
    即使将可变对象设置为值,从NSUserDefaults返回的值也是不可变的。例如,如果将可变字符串设置为“MyStringDefault”的值,则稍后使用stringForKey检索的字符串将是不可变的。
    默认数据库是为每个用户自动创建的。 NSUserDefaults类目前不支持每个主机的首选项。为此,您必须使用CFPreferences API(请参阅首选项实用程序)。但是,NSUserDefaults正确读取每个主机的首选项,因此您可以安全地将CFPreferences代码与NSUserDefaults代码混合。

    参考:https://www.cnblogs.com/zhun/p/5602048.html

    文件系统----File System

    • NSBundle

    bundle 是一个目录,其中包含了程序会使用到的资源,这些资源包含了图像,声音,编译好的代码,nib文件(用户也会把bundle称plug-in),对应bundle,cocoa提供了类NSBundle 存储在磁盘上的捆绑目录中的代码和资源。

    苹果使用捆绑来代表应用程序,框架,插件和许多其他特定类型的内容。软件包将其包含的资源组织到定义明​​确的子目录中,软件包结构因平台和软件包的类型而异。通过使用捆绑对象,您可以在不知道捆绑的结构的情况下访问捆绑的资源。捆绑对象提供一个单一的界面来定位项目,考虑到捆绑结构,用户偏好,可用的本地化和其他相关因素。
    任何可执行文件都可以使用一个bundle对象来定位资源,可以在应用程序的bundle中找到,也可以在位于别处的已知bundle中找到。您不使用捆绑对象来查找容器目录中的文件或文件系统的其他部分中的文件。
    使用捆绑对象的一般模式如下:
    为预期的捆绑目录创建一个捆绑对象。
    使用捆绑对象的方法来定位或加载所需的资源。
    使用其他系统API与资源进行交互。
    某些类型的常用资源可以在没有捆绑的情况下找到并打开。例如,加载图像时,将图像存储在资产目录中,并使用UIImage或NSImage的imageNamed:方法加载它们。同样,对于字符串资源,您可以使用NSLocalizedString来加载单个字符串,而不是自己加载整个.strings文件

    沙河和NSBundle的联系
    参考:http://www.jianshu.com/p/34cda6a121db
    参考用法:http://blog.csdn.net/mylizh/article/details/38662209

    • NSFileHandle

    NSFileHandle 此类主要是对文件内容进行读取和写入操作,文件描述符的面向对象的包装器

    可以使用文件句柄对象来访问与文件,套接字,管道和设备关联的数据。对于文件,您可以在文件中读取,写入和查找。对于套接字,管道和设备,可以使用文件句柄对象来监视设备并异步处理数据。
    NSFileHandle的大多数创建方法都会使文件句柄对象获取相关文件描述符的所有权。这意味着文件句柄对象都会创建文件描述符,并且负责在稍后关闭它,通常在文件句柄对象本身被释放的时候。如果您想使用与您创建的文件描述文件句柄对象,请使用initWithFileDescriptor:方法或使用initWithFileDescriptor:closeOnDealloc:方法,并传递NO的标志参数。
    运行循环注意事项
    使用文件句柄对象与套接字异步通信时,必须从具有活动运行循环的线程启动相应的操作。尽管读取,接受和等待操作本身是在后台线程上异步执行的,但文件句柄使用运行循环源来监视操作并适当地通知您的代码。因此,必须从应用程序的主线程或从已配置运行循环的任何线程中调用这些方法,并使用它们来处理事件。

    参考:http://www.jianshu.com/p/d49a00200586

    • NSFileManager

    NSFileMange 此类主要是对文件进行的操作以及文件信息的获取

    NSFileManager对象允许您检查文件系统的内容并对其进行更改。 NSFileManager类提供了对适用于大多数类型文件相关操作的共享文件管理器对象的方便访问。文件管理器对象通常是与文件系统交互的主要模式。您可以使用它来查找,创建,复制和移动文件和目录。您还可以使用它来获取有关文件或目录的信息或更改其某些属性。
    指定文件的位置时,可以使用NSURL或NSString对象。通常优先使用NSURL类来指定文件系统项目,因为它们可以在内部将路径信息转换为更高效的表示。您也可以从NSURL对象获取书签,该书签类似于别名,并且提供了更确定的方式来查找文件或目录。
    如果正在移动,复制,链接或删除文件或目录,则可以使用委托与文件管理器对象一起来管理这些操作。代表的作用是确认操作,并决定是否在发生错误时继续。在macOS 10.7及更高版本中,委托必须符合NSFileManagerDelegate协议。

    参考: http://www.jianshu.com/p/c683a97d2ee5

    • NSStream

    NSStream是一个抽象基类,定义了所有流对象的基础接口和属性。NSInputStream和NSOutputStream继承自NSStream,实现了输入流和输出流的默认行为。下图描述了流的应用场景:

    stream_src_dest.gif
    • NSInputStream

    NSInputStream 对应的是读文件,所以要记住它是要将文件的内容读到内存(你声明的一段buffer)里,用于读取文件

    • NSOutputStream

    NSOutputStream 对应的是写文件,它是要将已存在的内存(buffer)里的数据写入文件, 用于读取文件

    流的写入读取参考:http://www.jianshu.com/p/522ad40f96e1

    iOS Foundation 框架简介(下)

    相关文章

      网友评论

        本文标题:iOS Foundation 框架简介(上)

        本文链接:https://www.haomeiwen.com/subject/ygcwbxtx.html