一、NSArray:对象的静态有序集合
1.写法定义
@interface NSArray<__covariant ObjectType> : NSObject
2.概述
NSArray及其子类NSMutableArray管理有序的数组对象集合。NSArray创建静态数组,NSMutableArray创建动态数组。当需要对象的有序集合时,可以使用数组。 NSArray和它的核心基础对等物CFArrayRef是“免费桥接”的。有关免费桥接的更多信息,请参见免费桥接。
3.使用数组字面量创建NSArray对象
A:除了提供的初始化器,如initwithbjects:,你还可以使用数组字面量创建一个NSArray对象。
NSArray *array = @[someObject, @"Hello, World!", @42];
B:在Objective-C中,编译器生成的代码会对arraywithbjects:count:方法进行底层调用。
id objects[] = { someObject, @"Hello, World!", @42 };
NSUInteger count = sizeof(objects) / sizeof(id);
NSArray *array = [NSArray arrayWithObjects:objects count:count];
当使用这种文字语法时,你不应该用nil来结束对象列表,事实上nil是一个无效的值。有关Objective-C中对象字面量的更多信息,请参见Objective-C编程中使用对象。 在Swift中,NSArray类符合ArrayLiteralConvertible协议,它允许用数组字面量初始化。有关Swift中对象字面量的更多信息,请参见Swift编程语言(Swift 4.1)中的字面量表达式。
4.使用下标访问值
除了提供的实例方法,如objectAtIndex:,您还可以通过使用下标的索引访问NSArray值。
id value = array[3];
5.子类化的笔记
通常没有什么理由子类化NSArray。这个类很好地完成了它的设计目标——维护一个有序的对象集合。但在某些情况下,自定义NSArray对象可能会派上用场。以下是一些可能性:
- 改变NSArray存储集合元素的方式。这样做可能是出于性能方面的原因,或者是为了更好地与遗留代码兼容。
- 获取关于集合所发生情况的更多信息(例如,统计信息收集)。
方法覆盖
NSArray的任何子类必须覆盖初始实例方法count和objectAtIndex:。这些方法必须在为集合元素提供的后备存储上进行操作。对于这个后备存储,你可以使用一个静态数组,一个标准的NSArray对象,或者一些其他的数据类型或机制。你也可以选择部分或完全覆盖任何你想要提供替代实现的其他NSArray方法。 您可能希望为子类实现一个适合于子类所管理的后备存储的初始化器。如果你这样做,你的初始化器必须调用NSArray类的一个指定初始化器,init或initwithbjects:count:。NSArray类采用了NSCopying, nsmutablecopy和NSCoding协议;NSArray的自定义子类应该在必要时覆盖这些协议中的方法。 记住,NSArray是一个类集群的公共接口以及它对子类的要求。您必须为子类提供存储并实现直接作用于该存储的原语方法。
子类化的替代品
在创建NSArray的自定义子类之前,先研究NSPointerArray和相应的核心基础类型CFArray。因为NSArray和CFArray是“免费桥接”的,所以可以在代码中用CFArray对象代替NSArray对象(通过适当的强制转换)。尽管CFArray和NSArray是对应的类型,但它们并没有相同的接口或实现,而且有时你可以用CFArray做一些用NSArray做不到的事情。例如,CFArray提供了一组回调,其中一些回调用于实现自定义的retain-release行为。如果您为这些回调函数指定NULL实现,您可以很容易地得到一个非保留数组。
如果你想要补充现有类的行为,你可以在NSArray上写一个类别。但是请记住,这个类别将对您使用的所有NSArray实例有效,这可能会产生意想不到的后果。或者,您可以使用组合来实现所需的行为。
二.方法
1.创建Array
+ array:``创建并返回一个空数组。
+ arrayWithArray:创建并返回一个包含另一个给定数组中的对象的数组。
+ arrayWithObject:创建并返回一个包含给定对象的数组
+ arrayWithObjects:创建并返回一个包含参数列表中的对象的数组。
+ arrayWithObjects:count:创建并返回一个包含给定C数组中给定数目的对象的数组。
2.初始化数组
- init:初始化新分配的数组.
- initWithArray:通过将给定数组中包含的对象放入新分配的数组中来初始化该数组。建议:不可变数组以这种方式初始化后,就不能修改它了。
- initWithArray:copyItems:使用anArray作为数组的数据对象源来初始化新分配的数组。
- initWithObjects:通过在参数列表中放置对象来初始化新分配的数组。
- initWithObjects:count:初始化新分配的数组,以包含给定C数组中给定数量的对象。 不可变数组以这种方式初始化后,就不能修改它了。初始化后包含数组中的对象的数组。返回的对象可能与原始接收者不同。
3.查询数组
- containsObject:返回一个布尔值,该值指示给定对象是否存在于数组中
`count:数组中对象的数量.`
- getObjects:range:将数组中包含的位于指定范围内的对象复制到缓冲区
firstObject:数组中的第一个对象。
lastObject:数组中的最后一个对象。
- objectAtIndex:返回位于指定索引处的对象。
- objectAtIndexedSubscript:返回指定索引处的对象。
- objectsAtIndexes:返回一个数组,该数组包含数组中按给定索引集指定索引的对象。
— objectEnumerator:返回一个枚举数对象,该对象允许您访问数组中的每个对象。
—reverseObjectEnumerator:返回一个枚举数对象,该对象允许您以相反顺序访问数组中的每个对象。
4.在数组中查找对象
- indexOfObject:返回其对应的数组值等于给定对象的最低索引。
- indexOfObject: inRange:返回指定范围内的最低索引,其对应的数组值等于给定对象。
- indexOfObjectIdenticalTo:返回其对应的数组值与给定对象相同的最低索引。
- indexOfObjectIdenticalTo: inRange:返回指定范围内的最低索引,其对应的数组值等于给定对象。
- indexOfObjectPassingTest:返回数组中通过给定块中的测试的第一个对象的索引。
- indexOfObjectAtIndexes:options:passingTest:从给定索引集返回数组中第一个对象的索引,该对象在给定块中为给定枚举选项集通过了测试。
- indexesOfObjectsPassingTest:返回数组中通过给定块测试的对象的索引。
- indexesOfObjectsWithOptions: passingTest:返回数组中通过给定块中给定枚举选项集测试的对象的索引。
- indexesOfObjectsAtIndexes:选择:passingTest:从给定索引集返回数组中通过给定块中给定枚举选项集测试的对象的索引。
- indexesOfObjectsPassingTest:返回数组中通过给定块测试的对象的索引。
- indexesOfObjectsWithOptions: passingTest:返回数组中通过给定块中给定枚举选项集测试的对象的索引。
- indexesOfObjectsAtIndexes:选择:passingTest:从给定索引集返回数组中通过给定块中给定枚举选项集测试的对象的索引。
- indexOfObject: inSortedRange:选择:usingComparator:使用给定的NSComparator块,在指定范围内返回对象与数组中元素的索引。