知识普及:
1、数组中的元素在系统中都会有其默认对应的下标,下标是一个整形的数字,默认从0开始。
例:NSArray *arr3 = @["345","234","23"];
则当我们要取出数组中第一个元素时,有 arr3[0]= "345";如果出现我们要取出arr[3]时,程序会报错,因为此时的数组只有3个元素,对应的下标为0、1、2,没有3,这种情况我们称之为越界
2、在oc中汉字不能被直接打印出来,需要遍历操作;
3、数组中只能放对象。
一、两者特点与区别:
1、NSArry为静态数组(不可变数组),不能改动数组中的元素;
2、NSMutableArray为动态数组(可变数组),可变动(增、删、改、换)其中的元素;
二、两者常用到的方法:
1、NSArry函数的几种常用方法
获取
- -(NSUinteger)count 获取数组的元素个数
- -(void)objectAtIndex:(NSUinteger)index 获取索引位置(index)的元素
- -(undesigned)indexofObjext:(id) object 获取一个id类型的元素的位置
判断
- -(BOOL) countainsobject:(id) 判断是否包含一个id类型的对象
循环遍历(for循环、枚举器遍历、快速遍历)
- 具体方法见下面的实例
数组排序(调用方法排序、block(代码块)排序、描述法排序)
- 具体方法见下面的实例
2、NSMutableArry函数的几种常用方法
由于NSMutableArry是NSArry的子类,故而NSArry中的方法都可使用,但我们要谨记的是:NSMutableArry是可变数组,具体情况我们还要具体对待。
添加元素
- -(void)addObject:(id)object 添加一个id类型的元素
- -(void)insertObject:(id)object atIndex:(NSUinteger)index 在索引位置插入一个id类型的元素
- -(void)addObjectFromArray:(NSArray *)arry 将一个数组的全部元素添加到现有数组的末尾
删除元素
- -(void)removeObject:(id)object 移除数组中的特定元素
- -(void)removeObjects 删除所有元素
- -(void)removeObjectAtIndex:index 删除索引位置的元素
改动元素
- -(void)replaceObjectAtIndex:index withObject:(id)object 用特定元素替换索引位置的元素
- -(void)exchangeObjectAtIndex:index1 withObjectAtIndex:index2 交换两个索引位置的元素
循环遍历(for循环、枚举器遍历、快速遍历)
- 具体方法见下面的实例
数组排序(调用方法排序、block(代码块)排序、描述法排序)
- 具体方法见下面的实例
三、实例展示
1、NSArray(不可变数组)
- 初始化一个数组的三种方法
法一:初始化一个空数组
NSArray *arr1 = [NSArray array];
法二:初始化一个n元素的数组(n>=1):
NSArray *arr2 = [NSArray arrayWithObjects:@"1",@"zhang san",@"ABXZ", nil];
注意:当n=0时,“Objects”改为“Object”, 数组中没有“,nil”。
法三:直接给一个数组赋值
NSArray *arr3 = @[@"zhangsan",@"张三",@"23"];
注意:此时数组中有汉字,故而不能直接打印,要通过遍历才能将结果正确打印出来,具体操作见下面的程序段。
- 数组中元素个数
NSUInteger count=arr3.count;
NSLog(@"count=%ld",count);
- 数组中某元素的位置
unsigned long int i = [arr3 indexOfObject:@"234"];
NSLog(@"i = %ld",i);
- 循环遍历
法一:for循环遍历
for (int i = 0; i < arr3.count; i++) {
NSString *str = arr3[i];
NSLog(@"%@",str);
}
法二:枚举器遍历
- 获取数组所有元素的枚举器
注意:while循环中的“nextObject”在第一次循环时,其指向的是枚举器“e”中的第一个元素,每一次循环回来,它都会自动指向下一个元素,当它指向最后一个元素,并完成此次循环后,他会指向“nil”(空字符),此时循环结束。
法三:快速遍历
NSLog(@"obj1 = %@", obj1);
通过以上三种方法,都可得出以下结果:
2015-11-07 15:43:03.712 实验[1862:84687] 张三
2、NSMutableArry(可变数组)
初始化一个可变数组对象
法一:初始化一个空对象
同NSArray;
法二:初始化一个容量为n的空对象
NSMutableArray *arr1 = [NSMutableArray arrayWithCapacity:n];
注意:这里初始化的容量“n”比为非负整数,表示为创建的数组分配的内存空间。
法三:初始化一个有多个元素的数组
同NSArray;
NSMutableArray *arr2 = [NSMutableArray arrayWithObjects:@"34",@"22",@"35", nil];
注意:NSArray中的第三种方法在这里不能用,因为NSArray 的第三种方法初始化的数组是不可变的,如果用在可变数组中没有意义。
- 在数组末尾添加一个元素
[arr2 addObject:@"23"];
- 将一个数组中的所有元素添加到现有数组的末尾
[arr2 addObjectsFromArray:@[@"21",@"82"]];
- 在索引位置添加元素
[arr2 insertObject:@"360" atIndex:3];
注意:键入索引时,要保证索引的合理性,不能越界。
- 移除特定位置的元素
[arr2 removeObjectAtIndex:2];
- 替换索引位置的yuansu
[arr2 replaceObjectAtIndex:1 withObject:@"abc"];
- 遍历数组中的元素
for (NSString *s in arr2) {
[arr1 removeObject:@"1"];
NSLog(@"arr1=%@",s);
}
注意:在为可变数遍历时,不能对其变动(增、删、改、换)。
3、数组的运用
- copy数组
当我们在使用NSArray对应给另一个数组进行赋值时,直接赋值会报错,我们可以使用mutableCopy
NSMutableArray *a1 = [NSMutableArray arrayWithObject:@"1"];
NSArray *a2 = [NSArray arrayWithObject:@"2"];
a1 = [a2 mutableCopy];
a2 = [a1 mutableCopy];
NSLog(@"%@ %@",a1,a2);
结果为:[2487:199321] (
2
) (
2
)
有次我们不难看出,使用mutableCopy方法,只适用于可变数组NSMutableArray,一旦NSArray初始化完毕,既不可更改。
- 扩充数组
我们在网络请求时,往往会用到数组承接数据,但当我们遇到因网速不好/参数错误/借口错误等因素导致获取数据失败时,系统会自动报错。显示的错误信息时:数组无法添加一个空值。
因此在此种类似的情况下,我们就要在添加对象之前进行判断。