天天看点

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、NSArray类

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  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. #import <Foundation/Foundation.h>  
  9. //NSArray中不可以存放基本数据类型,只能存放类的实例,如果需要将基本类型、结构体放入到数组中得话,  
  10. //需要通过NSNumber/NSValue进行数据的封装,同时不能在NSArray中存储nil  
  11. int main(int argc, const charchar * argv[]) {  
  12.     @autoreleasepool {  
  13.         //1.---------------------数组的创建  
  14.         NSString *s1 = @"zhangsan";  
  15.         NSString *s2 = @"lisi";  
  16.         NSString *s3 = @"wangwu";  
  17.         //最后的nil相当于结束的标记  
  18.         NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil];  
  19.         //打印的时候会调用description方法  
  20.         //相当于:array1.description  
  21.         NSLog(@"%@",array1);  
  22.         //使用类方法创建  
  23.         array1 = [NSArray arrayWithObjects:s1,s2,s3, nil nil];  
  24.         //创建一个数组,将源数组中的数据拿出来放进去  
  25.         NSArray *array2 = [NSArray arrayWithArray:array1];  
  26.         //2.----------------------objectAtIndex  
  27.         //访问数组中的数据,数组中存放的是对象的指针  
  28.         NSString *str1 = [array1 objectAtIndex:0];  
  29.         //3.----------------------count  
  30.         //获取数组元素中的个数  
  31.         NSUInteger count = [array1 count];//返回的是一个无符号数值  
  32.         //4.----------------------containsObject  
  33.         //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值  
  34.         BOOL isContains = [array1 containsObject:@"zhangsan"];  
  35.         //5.----------------------indexOfObject  
  36.         //返回一个对象在数组中的下标值  
  37.         NSUInteger index = [array1 indexOfObject:@"zhangsan"];  
  38.         if(index == NSNotFound){  
  39.             //没有找到  
  40.         }else{  
  41.             //找到了  
  42.         }  
  43.         //6.----------------------componentsJoinedByString  
  44.         //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接  
  45.         //注意数组中的元素必须都是字符串  
  46.         NSString *content = [array1 componentsJoinedByString:@","];  
  47.         //7.----------------------lastObject  
  48.         //访问数组最后一个元素  
  49.         NSString *lastObj = [array1 lastObject];  
  50.         //8.----------------------arrayByAddingObject  
  51.         //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的  
  52.         NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];  
  53.         //数组的遍历  
  54.         for(int i=0;i<array1.count;i++){  
  55.             NSString *str = [array1 objectAtIndex:i];  
  56.             NSLog(@"%@",str);  
  57.         }  
  58.         //快速遍历  
  59.         for(NSString *s in array1){  
  60.             NSLog(@"%@",s);  
  61.         }  
  62.         //xcode4.4以后,编译器对数组的创建和访问语法做了优化  
  63.         NSArray *array7 = @[s1,s2,s3];  
  64.         NSString *s = array7[0];  
  65.     }  
  66.     return 0;  
  67. }  

下面来看一下他的操作方法:

1、NSArray的创建

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  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对象,结果:

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象

我们看到了,会打印出非常格式化的数据出来,这个原因是因为NSLog打印对象的时候会调用其description方法,和Java中的toString方法一样,当然我们可以重写这个方法的,后面会说到。

我们还可以使用类方法创建NSArray:

[java]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //使用类方法创建  
  2. array1 = [NSArray arrayWithObjects:s1,s2,s3, nil];  
  3. //创建一个数组,将源数组中的数据拿出来放进去  
  4. NSArray *array2 = [NSArray arrayWithArray:array1];  

2、使用下标访问元素

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //2.----------------------objectAtIndex  
  2. //访问数组中的数据,数组中存放的是对象的指针  
  3. NSString *str1 = [array1 objectAtIndex:0];  

3、获取数组的大小

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //3.----------------------count  
  2. //获取数组元素中的个数  
  3. NSUInteger count = [array1 count];//返回的是一个无符号数值  

NSUInteger是无符号的int类型

4、是否包含某一个元素

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //4.----------------------containsObject  
  2. //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值  
  3. BOOL isContains = [array1 containsObject:@"zhangsan"];  

5、找到一个元素在数组中的下标

[java]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //5.----------------------indexOfObject  
  2. //返回一个对象在数组中的下标值  
  3. NSUInteger index = [array1 indexOfObject:@"zhangsan"];  
  4. if(index == NSNotFound){  
  5.     //没有找到  
  6. }else{  
  7.     //找到了  
  8. }  

这里我们看到用到了一个系统常量:NSNotFound,我们可以看到他的定义:

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. #define NSIntegerMax    LONG_MAX  

看到了,是一个Long类型的最大值。

6、使用指定的连接符连接数组中所有的元素

[java]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //6.----------------------componentsJoinedByString  
  2. //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接  
  3. //注意数组中的元素必须都是字符串  
  4. NSString *content = [array1 componentsJoinedByString:@","];  

7、在数组的尾部增加一个元素

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //8.----------------------arrayByAddingObject  
  2. //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的  
  3. NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];  

因为NSArray是不可变的,所以会产生一个新的NSArray对象,返回回来

8、数组的遍历

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //数组的遍历  
  2. for(int i=0;i<array1.count;i++){  
  3.     NSString *str = [array1 objectAtIndex:i];  
  4.     NSLog(@"%@",str);  
  5. }  
  6. //快速遍历  
  7. for(NSString *s in array1){  
  8.     NSLog(@"%@",s);  
  9. }  

第二种方式和Java中的快速遍历是一样的。

9、Xcode4.4之后新增了NSArray快速创建的一种方式

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //xcode4.4以后,编译器对数组的创建和访问语法做了优化  
  2. NSArray *array7 = @[s1,s2,s3];  
  3. NSString *s = array7[0];  

这种方式比之前的创建方式又快又方便,而且符合正常的创建方式,访问的时候也是可以直接用下标进行获取元素

二、NSMutableArray类

NSArray类是不可变的,NSMutableArray类是可变的,可变类一样的特性,就是可以进行增删改查操作

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的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. #import <Foundation/Foundation.h>  
  9. //NSMutableArray继承NSArray类,有NSArray中的所有方法  
  10. int main(int argc, const charchar * argv[]) {  
  11.     @autoreleasepool {  
  12.         //1.---------------------创建可变数组  
  13.         NSString *str1 = @"zhangsan";  
  14.         NSString *str2 = @"lisi";  
  15.         NSString *str3 = @"wangwu";  
  16.         NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil nil];  
  17.         //下面的这种方式创建的数组是错误的  
  18.         //下面的这种方式是创建不可变数组的方式,不能哟关于可变数组的创建  
  19.         //NSMutableArray *array1 = @[str1,str2,str3];  
  20.         //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间  
  21.         NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];  
  22.         //使用类方法创建  
  23.         NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];  
  24.         //2.---------------------addObject  
  25.         //添加元素的方法  
  26.         [mArray1 addObject:str1];  
  27.         [mArray1 addObject:str2];  
  28.         //添加数组,把mArray1中的所有元素全部添加到mArray2中  
  29.         [mArray2 addObjectsFromArray:mArray1];  
  30.         NSLog(@"mArray3 = %@",mArray2);  
  31.         //二维数组  
  32.         //这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了  
  33.         [mArray2 addObject:mArray1];  
  34.         //3.---------------------insertObject  
  35.         //在指定的位置上插入特定元素  
  36.         [mArray2 insertObject:@"def" atIndex:0];  
  37.         //4.---------------------replaceObjectAdIdex  
  38.         //替换元素  
  39.         [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];  
  40.         //5.---------------------exchangeObjectAtIndex  
  41.         //互换两个元素的位置  
  42.         [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];  
  43.         //6.---------------------removeObjectAdIndex  
  44.         //删除指定位置的元素  
  45.         [mArray2 removeObjectAtIndex:0];  
  46.         //删除最后一个元素  
  47.         [mArray2 removeLastObject];  
  48.         //删除指定的对象  
  49.         [mArray2 removeObject:@"lisi"];  
  50.         //删除所有的对象/清空列表  
  51.         [mArray2 removeAllObjects];  
  52.     }  
  53.     return 0;  
  54. }  

1、创建方法

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  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. //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间  
  10. NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];  
  11. //使用类方法创建  
  12. NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];  

创建方式和NSArray类似,但是有一种方式不能用,就是直接创建的方式,那个只能用于创建不变数组。

但是可变数组还有一个方法就是能够事先的设置数组的大小,而且超过这个大小之后,数组会自动扩充,类似于C语言中的动态数组的实现。

2、添加元素

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  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. //这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了  
  10. [mArray2 addObject:mArray1];  
  11. NSLog(@"mArray3 = %@",mArray2);  

使用addObjectsFromArray方法是将一个数组中的每个元素添加到指定的数组中

使用addObject方法是讲一个数组整个都添加到指定的数组中了,那么这个数组就变成二维数组了

这个两个方法要区分一下~~

下面是运行结果:

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象

3、在数组的指定位置上插入元素

[java]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //3.---------------------insertObject  
  2. //在指定的位置上插入特定元素  
  3. [mArray2 insertObject:@"def" atIndex:0];  

4、替换元素

[java]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //4.---------------------replaceObjectAdIdex  
  2. //替换元素  
  3. [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];  

5、互换两个元素的位置

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //5.---------------------exchangeObjectAtIndex  
  2. //互换两个元素的位置  
  3. [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];  

6、删除方法

[objc]  view plain copy

黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
黑马程序员--OC学习篇之Foundation框架中的NSArray对象和NSMutableArray对象
  1. //6.---------------------removeObjectAdIndex  
  2. //删除指定位置的元素  
  3. [mArray2 removeObjectAtIndex:0];  
  4. //删除最后一个元素  
  5. [mArray2 removeLastObject];  
  6. //删除指定的对象  
  7. [mArray2 removeObject:@"lisi"];  
  8. //删除所有的对象/清空列表  
  9. [mArray2 removeAllObjects];