
4.3 数组类
4.3.1 不可变数组NSArray
数组是有序的对象集合。一般情况下,一个数组中的元素都是同一类型的对象。Objective-C的数组比C++、Java的数组强大之处在于,NSArray保存的对象可以是不同类型的对象。但是缺点是只能保存对象,int、char、double等基本数据类型不能直接保存,需要通过转换成Objective-C对象后才能加入数组。
在Foundation框架中,提供了NSArray类来管理与数组相关的操作。NSArray类的数组是不可变数组,这种不可变包括:数组中不能新增元素,并且数组内已经存在的对象也不支持修改。如果希望对数组进行修改,那么在声明时需要把数组声明为NSMutableArray(可变数组),NSMutableArray类是NSArray类的子类。
1.创建数组
在Foundation框架中,可以采用以下几种方式来创建数组。
- 使用@[]。这种方式是创建数组经常使用的方式之一,只需要把数组中需要保存的对象放在中括号中间即可。

注意:可以看到在创建array2时,数组中保存的数据对象类型可以不同,这个是Objective-C的特点之一。
- 使用arrayWithObjects:方法。这是一个类方法。这种方式创建数组,数组的结尾需要添加一个空对象nil来标识数组的结尾。

- 使用initWithObjects:方法。这是一个实例方法,需要提前执行alloc操作。

2.数组的复制
当直接把一个数组对象赋值给另外一个数组对象时,此时进行的是指针复制,即在内存中,数组中的对象只保留了一个版本。另外,在NSArray类中,提供了arrayWithArray:方法,这个方法对原数组进行了完整的复制,从而得到了一个全新的数组。

运行结果如图4-10所示。

图4-10 运行结果
3.数组元素操作
在实际开发过程中,当需要访问数组中的对象时,可以通过以下几种方式。
- 通过下标来访问。数组中的元素是有序存储的,所以可以通过下标来访问。使用下标访问,既可以调用objectAtIndex:方法,也可以直接使用数组名称[序号]来访问,具体方式见下方代码。

运行结果如图4-11所示。

图4-11 运行结果
- 获取某个对象对应的下标。可以通过indexOfObject:方法来获取某个对象在数组中的下标,需要注意的是数组中的第一个元素的下标为0。

运行结果如图4-12所示。

图4-12 运行结果
- 查找数组中的对象。有时希望查找某个对象是否存在在某个数组中,可以使用containsObject:方法来判断。

运行结果如图4-13所示。

图4-13 运行结果
4.其他常用操作
对于不可变数组NSArray来说,除了上面介绍数组对象创建、元素访问方法之外,还有以下几个在NSArray类中提供的属性和方法也相对常用。
- count:返回数组中元素的个数。

- firstObject:获取数组中的第一个对象。

- lastObject:获取数组中的最后一个对象。

4.3.2 可变数组NSMutableArray
可变数组(NSMutableArray类),顾名思义即可以对数组内的元素数量进行增加、删除,同时也可以对存储元素的内容进行修改。由于NSMutableArray类是NSArray类的子类,因此NSArray类的方法和属性,NSMutableArray类都可以继承使用。
1.可变数组创建
可变数组在初始化时可以设置容量为任意值,在执行一系列插入删除等操作时数组会根据元素的数量自动改变容量大小。通常情况下,可变数组可以使用以下几种方式来初始化(实例化)。
- 使用array方法。使用该方法时,不指定可变数组的容量,使用起来比较简单,也是通常使用的方法。
- 使用arrayWithCapacity方法。这是一个类方法,需要提供数组的初始容量。
- 使用initWithCapacity方法。这是一个类实例方法,需要提供数组的初始容量。

2.可变数组的元素操作
与不可变数组相比,可变数组可以对其中的元素进行修改操作,常用的有以下几个。
- 在数组末尾增加某个元素。

- 在指定位置增加元素。

- 替换某个下标的元素。

- 删除元素。

- 删除指定下标的元素。

- 删除所有元素。

- 修改某个元素对象的值。可以使用赋值运算符直接更新数组中某个下标对象的值。

运行结果如图4-14所示。

图4-14 运行结果