我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArray类是不可变的,NSMutableArray类是可变的。下面就先来看一下NSArray类
 
一、NSArray类
 
-   
- #import <Foundation/Foundation.h>  
- int main(int argc, const charchar * argv[]) {  
-     @autoreleasepool {  
-         
-         NSString *s1 = @"zhangsan";  
-         NSString *s2 = @"lisi";  
-         NSString *s3 = @"wangwu";  
-         
-         NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil];  
-         
-         
-         NSLog(@"%@",array1);  
-           
-         
-         array1 = [NSArray arrayWithObjects:s1,s2,s3, nil nil];  
-           
-         
-         NSArray *array2 = [NSArray arrayWithArray:array1];  
-           
-           
-         
-         
-         NSString *str1 = [array1 objectAtIndex:0];  
-           
-           
-         
-         
-         NSUInteger count = [array1 count];
-           
-           
-         
-         
-         BOOL isContains = [array1 containsObject:@"zhangsan"];  
-           
-           
-         
-         
-         NSUInteger index = [array1 indexOfObject:@"zhangsan"];  
-         if(index == NSNotFound){  
-             
-         }else{  
-             
-         }  
-           
-           
-         
-         
-         
-         NSString *content = [array1 componentsJoinedByString:@","];  
-           
-           
-         
-         
-         NSString *lastObj = [array1 lastObject];  
-           
-           
-         
-         
-         NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];  
-           
-           
-         
-         for(int i=0;i<array1.count;i++){  
-             NSString *str = [array1 objectAtIndex:i];  
-             NSLog(@"%@",str);  
-         }  
-           
-         
-         for(NSString *s in array1){  
-             NSLog(@"%@",s);  
-         }  
-           
-         
-         NSArray *array7 = @[s1,s2,s3];  
-         NSString *s = array7[0];  
-           
-     }  
-     return 0;  
- }  
 
下面来看一下他的操作方法:
 
1、NSArray的创建
 
- NSString *s1 = @"zhangsan";  
- NSString *s2 = @"lisi";  
- NSString *s3 = @"wangwu";  
- NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil];  
- NSLog(@"%@",array1);  
 
我们看到他的initWithObjects方法的最后一个值为nil,这个我们在之前说到过这个值,他是空指针的意思,和Java中的null一样的,这里为什么在创建NSArray的时候最后一个值为空呢?这个和C语言中的场景是类似的,C语言中字符串的结束符为‘/0‘,那么这里的NSArray的最后一个元素为nil,原因是标记NSArray结束了。
 
然后我们调用NSLog方法打印NSArray对象,结果:

我们看到了,会打印出非常格式化的数据出来,这个原因是因为NSLog打印对象的时候会调用其description方法,和Java中的toString方法一样,当然我们可以重写这个方法的,后面会说到。
我们还可以使用类方法创建NSArray:
 
- array1 = [NSArray arrayWithObjects:s1,s2,s3, nil];  
-   
- NSArray *array2 = [NSArray arrayWithArray:array1];  
 
 
 
2、使用下标访问元素
 
- NSString *str1 = [array1 objectAtIndex:0];  
 
 
 
3、获取数组的大小
 
- NSUInteger count = [array1 count];
 
NSUInteger是无符号的int类型
 
 
4、是否包含某一个元素
 
- BOOL isContains = [array1 containsObject:@"zhangsan"];  
 
 
 
5、找到一个元素在数组中的下标
 
- NSUInteger index = [array1 indexOfObject:@"zhangsan"];  
- if(index == NSNotFound){  
-     
- }else{  
-     
- }  
 
这里我们看到用到了一个系统常量:NSNotFound,我们可以看到他的定义:
 
 
- #define NSIntegerMax    LONG_MAX  
 
看到了,是一个Long类型的最大值。
 
 
6、使用指定的连接符连接数组中所有的元素
 
- NSString *content = [array1 componentsJoinedByString:@","];  
 
 
 
7、在数组的尾部增加一个元素
 
- NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];  
 
因为NSArray是不可变的,所以会产生一个新的NSArray对象,返回回来
 
 
8、数组的遍历
 
- for(int i=0;i<array1.count;i++){  
-     NSString *str = [array1 objectAtIndex:i];  
-     NSLog(@"%@",str);  
- }  
-   
- for(NSString *s in array1){  
-     NSLog(@"%@",s);  
- }  
 
第二种方式和Java中的快速遍历是一样的。
 
 
9、Xcode4.4之后新增了NSArray快速创建的一种方式
 
- NSArray *array7 = @[s1,s2,s3];  
- NSString *s = array7[0];  
 
这种方式比之前的创建方式又快又方便,而且符合正常的创建方式,访问的时候也是可以直接用下标进行获取元素
 
 
二、NSMutableArray类
NSArray类是不可变的,NSMutableArray类是可变的,可变类一样的特性,就是可以进行增删改查操作
 
-   
- #import <Foundation/Foundation.h>  
-   
- int main(int argc, const charchar * argv[]) {  
-     @autoreleasepool {  
-         
-         NSString *str1 = @"zhangsan";  
-         NSString *str2 = @"lisi";  
-         NSString *str3 = @"wangwu";  
-         NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil nil];  
-         
-         
-         
-           
-         
-         NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];  
-         
-         NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];  
-           
-           
-         
-         
-         [mArray1 addObject:str1];  
-         [mArray1 addObject:str2];  
-         
-         [mArray2 addObjectsFromArray:mArray1];  
-         NSLog(@"mArray3 = %@",mArray2);  
-           
-         
-         
-         [mArray2 addObject:mArray1];  
-           
-           
-         
-         
-         [mArray2 insertObject:@"def" atIndex:0];  
-           
-           
-         
-         
-         [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];  
-           
-           
-         
-         
-         [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];  
-           
-           
-         
-         
-         [mArray2 removeObjectAtIndex:0];  
-         
-         [mArray2 removeLastObject];  
-         
-         [mArray2 removeObject:@"lisi"];  
-         
-         [mArray2 removeAllObjects];  
-     }  
-     return 0;  
- }  
 
1、创建方法
 
 
- NSString *str1 = @"zhangsan";  
- NSString *str2 = @"lisi";  
- NSString *str3 = @"wangwu";  
- NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil nil];  
-   
- NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];  
- NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];  
 
创建方式和NSArray类似,但是有一种方式不能用,就是直接创建的方式,那个只能用于创建不变数组。
 
但是可变数组还有一个方法就是能够事先的设置数组的大小,而且超过这个大小之后,数组会自动扩充,类似于C语言中的动态数组的实现。
 
2、添加元素
 
- [mArray1 addObject:str1];  
- [mArray1 addObject:str2];  
- [mArray2 addObjectsFromArray:mArray1];  
- NSLog(@"mArray3 = %@",mArray2);  
-           
- [mArray2 addObject:mArray1];  
- NSLog(@"mArray3 = %@",mArray2);  
 
使用addObjectsFromArray方法是将一个数组中的每个元素添加到指定的数组中
 
使用addObject方法是讲一个数组整个都添加到指定的数组中了,那么这个数组就变成二维数组了
这个两个方法要区分一下~~
下面是运行结果:
 

 
3、在数组的指定位置上插入元素
 
- [mArray2 insertObject:@"def" atIndex:0];  
 
 
 
4、替换元素
 
- [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];  
 
5、互换两个元素的位置
 
 
- [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];  
 
6、删除方法
 
 
- [mArray2 removeObjectAtIndex:0];  
- [mArray2 removeLastObject];  
- [mArray2 removeObject:@"lisi"];  
- [mArray2 removeAllObjects];  
 
总结
 
这篇文章就介绍了Foundation框架中的NSArray类和NSMutableArray类,他们是用来存放一些指定类型的元素的
注:OC中没有泛型的概念,所以对于数组中存放了不同类型的值,在运行的时候会报错的,这个和Java相比,操作集合类的时候安全性就差了点。所以我们在操作集合类的时候需要注意的地方。
OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
原文:http://www.cnblogs.com/dreamDeveloper/p/6024634.html