标签:
在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArray类是不可变的,NSMutableArray类是可变的。
下面就先来看一下NSArray类:
一、NSArray类
1 // 2 // main.m 3 // 16_NSArray 4 // 5 // Created by jiangwei on 14-10-12. 6 // Copyright (c) 2014年 jiangwei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 //NSArray中不可以存放基本数据类型,只能存放类的实例,如果需要将基本类型、结构体放入到数组中得话, 11 //需要通过NSNumber/NSValue进行数据的封装,同时不能在NSArray中存储nil 12 int main(int argc, const charchar * argv[]) { 13 @autoreleasepool { 14 //1.---------------------数组的创建 15 NSString *s1 = @"zhangsan"; 16 NSString *s2 = @"lisi"; 17 NSString *s3 = @"wangwu"; 18 //最后的nil相当于结束的标记 19 NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil]; 20 //打印的时候会调用description方法 21 //相当于:array1.description 22 NSLog(@"%@",array1); 23 24 //使用类方法创建 25 array1 = [NSArray arrayWithObjects:s1,s2,s3, nil nil]; 26 27 //创建一个数组,将源数组中的数据拿出来放进去 28 NSArray *array2 = [NSArray arrayWithArray:array1]; 29 30 31 //2.----------------------objectAtIndex 32 //访问数组中的数据,数组中存放的是对象的指针 33 NSString *str1 = [array1 objectAtIndex:0]; 34 35 36 //3.----------------------count 37 //获取数组元素中的个数 38 NSUInteger count = [array1 count];//返回的是一个无符号数值 39 40 41 //4.----------------------containsObject 42 //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值 43 BOOL isContains = [array1 containsObject:@"zhangsan"]; 44 45 46 //5.----------------------indexOfObject 47 //返回一个对象在数组中的下标值 48 NSUInteger index = [array1 indexOfObject:@"zhangsan"]; 49 if(index == NSNotFound){ 50 //没有找到 51 }else{ 52 //找到了 53 } 54 55 56 //6.----------------------componentsJoinedByString 57 //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接 58 //注意数组中的元素必须都是字符串 59 NSString *content = [array1 componentsJoinedByString:@","]; 60 61 62 //7.----------------------lastObject 63 //访问数组最后一个元素 64 NSString *lastObj = [array1 lastObject]; 65 66 67 //8.----------------------arrayByAddingObject 68 //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的 69 NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"]; 70 71 72 //数组的遍历 73 for(int i=0;i<array1.count;i++){ 74 NSString *str = [array1 objectAtIndex:i]; 75 NSLog(@"%@",str); 76 } 77 78 //快速遍历 79 for(NSString *s in array1){ 80 NSLog(@"%@",s); 81 } 82 83 //xcode4.4以后,编译器对数组的创建和访问语法做了优化 84 NSArray *array7 = @[s1,s2,s3]; 85 NSString *s = array7[0]; 86 87 } 88 return 0; 89 }
下面来看一下他的操作方法:
1、NSArray的创建
1 //1.---------------------数组的创建 2 NSString *s1 = @"zhangsan"; 3 NSString *s2 = @"lisi"; 4 NSString *s3 = @"wangwu"; 5 //最后的nil相当于结束的标记 6 NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil]; 7 //打印的时候会调用description方法 8 //相当于:array1.description 9 NSLog(@"%@",array1);
我们看到他的initWithObjects方法的最后一个值为nil,这个我们在之前说到过这个值,他是空指针的意思,和Java中的null一样的,这里为什么在创建NSArray的时候最后一个值为空呢?这个和C语言中的场景是类似的,C语言中字符串的结束符为‘/0‘,那么这里的NSArray的最后一个元素为nil,原因是标记NSArray结束了。
然后我们调用NSLog方法打印NSArray对象,结果:
我们看到了,会打印出非常格式化的数据出来,这个原因是因为NSLog打印对象的时候会调用其description方法,和Java中的toString方法一样,当然我们可以重写这个方法的,后面会说到。
我们还可以使用类方法创建NSArray:
1 //使用类方法创建 2 array1 = [NSArray arrayWithObjects:s1,s2,s3, nil]; 3 4 //创建一个数组,将源数组中的数据拿出来放进去 5 NSArray *array2 = [NSArray arrayWithArray:array1];
2、使用下标访问元素
1 //2.----------------------objectAtIndex 2 //访问数组中的数据,数组中存放的是对象的指针 3 NSString *str1 = [array1 objectAtIndex:0];
3、获取数组的大小
1 //3.----------------------count 2 //获取数组元素中的个数 3 NSUInteger count = [array1 count];//返回的是一个无符号数值
NSUInteger是无符号的int类型。
4、是否包含某一个元素
1 //4.----------------------containsObject 2 //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值 3 BOOL isContains = [array1 containsObject:@"zhangsan"];
5、找到一个元素在数组中的下标
1 //5.----------------------indexOfObject 2 //返回一个对象在数组中的下标值 3 NSUInteger index = [array1 indexOfObject:@"zhangsan"]; 4 if(index == NSNotFound){ 5 //没有找到 6 }else{ 7 //找到了 8 }
这里我们看到用到了一个系统常量:NSNotFound,我们可以看到他的定义:
1 #define NSIntegerMax LONG_MAX
看到了,是一个Long类型的最大值。
6、使用指定的连接符连接数组中所有的元素
1 //6.----------------------componentsJoinedByString 2 //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接 3 //注意数组中的元素必须都是字符串 4 NSString *content = [array1 componentsJoinedByString:@","];
7、在数组的尾部增加一个元素
1 //8.----------------------arrayByAddingObject 2 //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的 3 NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];
因为NSArray是不可变的,所以会产生一个新的NSArray对象,返回回来。
8、数组的遍历
1 //数组的遍历 2 for(int i=0;i<array1.count;i++){ 3 NSString *str = [array1 objectAtIndex:i]; 4 NSLog(@"%@",str); 5 } 6 7 //快速遍历 8 for(NSString *s in array1){ 9 NSLog(@"%@",s); 10 }
第二种方式和Java中的快速遍历是一样的。
9、Xcode4.4之后新增了NSArray快速创建的一种方式
1 //xcode4.4以后,编译器对数组的创建和访问语法做了优化 2 NSArray *array7 = @[s1,s2,s3]; 3 NSString *s = array7[0];
这种方式比之前的创建方式又快又方便,而且符合正常的创建方式,访问的时候也是可以直接用下标进行获取元素。
二、NSMutableArray类
NSArray类是不可变的,NSMutableArray类是可变的,可变类一样的特性,就是可以进行增删改查操作。
1 // 2 // main.m 3 // 17_NSMutableArray 4 // 5 // Created by jiangwei on 14-10-12. 6 // Copyright (c) 2014年 jiangwei. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 //NSMutableArray继承NSArray类,有NSArray中的所有方法 12 int main(int argc, const charchar * argv[]) { 13 @autoreleasepool { 14 //1.---------------------创建可变数组 15 NSString *str1 = @"zhangsan"; 16 NSString *str2 = @"lisi"; 17 NSString *str3 = @"wangwu"; 18 NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil nil]; 19 //下面的这种方式创建的数组是错误的 20 //下面的这种方式是创建不可变数组的方式,不能哟关于可变数组的创建 21 //NSMutableArray *array1 = @[str1,str2,str3]; 22 23 //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间 24 NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5]; 25 //使用类方法创建 26 NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5]; 27 28 29 //2.---------------------addObject 30 //添加元素的方法 31 [mArray1 addObject:str1]; 32 [mArray1 addObject:str2]; 33 //添加数组,把mArray1中的所有元素全部添加到mArray2中 34 [mArray2 addObjectsFromArray:mArray1]; 35 NSLog(@"mArray3 = %@",mArray2); 36 37 //二维数组 38 //这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了 39 [mArray2 addObject:mArray1]; 40 41 42 //3.---------------------insertObject 43 //在指定的位置上插入特定元素 44 [mArray2 insertObject:@"def" atIndex:0]; 45 46 47 //4.---------------------replaceObjectAdIdex 48 //替换元素 49 [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"]; 50 51 52 //5.---------------------exchangeObjectAtIndex 53 //互换两个元素的位置 54 [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3]; 55 56 57 //6.---------------------removeObjectAdIndex 58 //删除指定位置的元素 59 [mArray2 removeObjectAtIndex:0]; 60 //删除最后一个元素 61 [mArray2 removeLastObject]; 62 //删除指定的对象 63 [mArray2 removeObject:@"lisi"]; 64 //删除所有的对象/清空列表 65 [mArray2 removeAllObjects]; 66 } 67 return 0; 68 }
1、创建方法
1 //1.---------------------创建可变数组 2 NSString *str1 = @"zhangsan"; 3 NSString *str2 = @"lisi"; 4 NSString *str3 = @"wangwu"; 5 NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil nil]; 6 //下面的这种方式创建的数组是错误的 7 //下面的这种方式是创建不可变数组的方式,不能用于可变数组的创建 8 //NSMutableArray *array1 = @[str1,str2,str3]; 9 10 //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间 11 NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5]; 12 //使用类方法创建 13 NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];
创建方式和NSArray类似,但是有一种方式不能用,就是直接创建的方式,那个只能用于创建不变数组。
但是可变数组还有一个方法就是能够事先的设置数组的大小,而且超过这个大小之后,数组会自动扩充,类似于C语言中的动态数组的实现。
2、添加元素
1 //2.---------------------addObject 2 //添加元素的方法 3 [mArray1 addObject:str1]; 4 [mArray1 addObject:str2]; 5 //添加数组,把mArray1中的所有元素全部添加到mArray2中 6 [mArray2 addObjectsFromArray:mArray1]; 7 NSLog(@"mArray3 = %@",mArray2); 8 9 //二维数组 10 //这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了 11 [mArray2 addObject:mArray1]; 12 NSLog(@"mArray3 = %@",mArray2);
使用addObjectsFromArray方法是将一个数组中的每个元素添加到指定的数组中。
使用addObject方法是讲一个数组整个都添加到指定的数组中了,那么这个数组就变成二维数组了。
这个两个方法要区分一下~~
下面是运行结果:
3、在数组的指定位置上插入元素
1 //3.---------------------insertObject 2 //在指定的位置上插入特定元素 3 [mArray2 insertObject:@"def" atIndex:0];
4、替换元素
1 //4.---------------------replaceObjectAdIdex 2 //替换元素 3 [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];
5、互换两个元素的位置
1 //5.---------------------exchangeObjectAtIndex 2 //互换两个元素的位置 3 [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];
6、删除方法
1 //6.---------------------removeObjectAdIndex 2 //删除指定位置的元素 3 [mArray2 removeObjectAtIndex:0]; 4 //删除最后一个元素 5 [mArray2 removeLastObject]; 6 //删除指定的对象 7 [mArray2 removeObject:@"lisi"]; 8 //删除所有的对象/清空列表 9 [mArray2 removeAllObjects];
总结
这篇文章就介绍了Foundation框架中的NSArray类和NSMutableArray类,他们是用来存放一些指定类型的元素的
注:OC中没有泛型的概念,所以对于数组中存放了不同类型的值,在运行的时候会报错的,这个和Java相比,操作集合类的时候安全性就差了点。所以我们在操作集合类的时候需要注意的地方。
(转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
标签:
原文地址:http://www.cnblogs.com/iLillian/p/4199439.html