OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

在之前的一篇文章中介绍了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相比,操作集合类的时候安全性就差了点。所以我们在操作集合类的时候需要注意的地方。

你可能感兴趣的:(NSArray)