OC知识梳理-NSArray与NSMutableArray相关知识
2015-11-09 17:43
405 查看
知识普及:
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);
}
法二:枚举器遍历
获取数组所有元素的枚举器
NSEnumerator *e = [arr1 objectEnumerator];
NSString *obj;
while(obj = [e nextObject]){
NSLog(@"---%@",obj);
}
注意:while循环中的“nextObject”在第一次循环时,其指向的是枚举器“e”中的第一个元素,每一次循环回来,它都会自动指向下一个元素,当它指向最后一个元素,并完成此次循环后,他会指向“nil”(空字符),此时循环结束。
法三:快速遍历
for (id obj1 in arr1) {
NSLog(@"obj1 = %@", obj1);
}
通过以上三种方法,都可得出以下结果:
2015-11-07 15:43:03.711 实验[1862:84687] zhangsan
2015-11-07 15:43:03.712 实验[1862:84687] 张三
2015-11-07 15:43:03.712 [b]实验[/b][1862:84687] 1234
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初始化完毕,既不可更改。
扩充数组
我们在网络请求时,往往会用到数组承接数据,但当我们遇到因网速不好/参数错误/借口错误等因素导致获取数据失败时,系统会自动报错。显示的错误信息时:数组无法添加一个空值。
因此在此种类似的情况下,我们就要在添加对象之前进行判断。
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);
}
法二:枚举器遍历
获取数组所有元素的枚举器
NSEnumerator *e = [arr1 objectEnumerator];
NSString *obj;
while(obj = [e nextObject]){
NSLog(@"---%@",obj);
}
注意:while循环中的“nextObject”在第一次循环时,其指向的是枚举器“e”中的第一个元素,每一次循环回来,它都会自动指向下一个元素,当它指向最后一个元素,并完成此次循环后,他会指向“nil”(空字符),此时循环结束。
法三:快速遍历
for (id obj1 in arr1) {
NSLog(@"obj1 = %@", obj1);
}
通过以上三种方法,都可得出以下结果:
2015-11-07 15:43:03.711 实验[1862:84687] zhangsan
2015-11-07 15:43:03.712 实验[1862:84687] 张三
2015-11-07 15:43:03.712 [b]实验[/b][1862:84687] 1234
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初始化完毕,既不可更改。
扩充数组
我们在网络请求时,往往会用到数组承接数据,但当我们遇到因网速不好/参数错误/借口错误等因素导致获取数据失败时,系统会自动报错。显示的错误信息时:数组无法添加一个空值。
因此在此种类似的情况下,我们就要在添加对象之前进行判断。
相关文章推荐
- Android自定义控件之仿汽车之家下拉刷新
- linux下vi编辑器常用命令
- iOS开发日记45-ARC和内存管理
- cordova android项目自定义插件及使用(一)
- 手机自动化测试:appium源码分析之bootstrap十
- .NET 4.0 使用 asyn await
- 16进制数的定义以及输入输出
- c# 百度语音合成
- Oracle 阻塞会话的查看与解除
- 搭建ftp服务器
- stopPropagation(), preventDefault() , return false 事件
- 手机自动化测试:appium源码分析之bootstrap九
- hdoj 5240 Exam
- 银行计算利息-20151106
- jsp回车空格时触发事件
- Android应用程序打包时,出现错误:"XXX" is not translated in "af" (Afrikaans), "am" (Amharic), "ar" (Arabic).....
- ConcurrentHashMap原理
- 手机自动化测试:appium源码分析之bootstrap八
- jsp中设置http的P3P头实现跨域设置cookie
- [前端] 重复字符串函数