Foundation框架(NSArray、NSMutableArray)

第一讲 NSArray、NSMutableArray

一、NSArray

概述:NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组,C语言中数组的弊端,int array[4] = {10, 89, 27, 76};只能存放一种类型的数据.(类型必须一致),不能很方便地动态添加数组元素、不能很方便地动态删除数组元素(长度固定)。

使用注意:只能存放任意OC对象, 并且是有顺序的,不能存储非OC对象, 比如int\float\double\char\enum\struct等它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素

 

1、数组的创建  

1 NSArray *array = [NSArray array];  //类方法创一个数组,这个数组永远为空
2 NSArray *arr = [[NSArray alloc]init];   //对象方法创建一个数组,这个数组永远为空
3 NSArray *array2 = [NSArray arrayWithObject:@“jack”];  //类方法创建含有一个元素的数组
4 NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil]; //创建含有多个元素的NSArray数组
5 NSArray *array4 = @[@"jack", @"rose", @“4324324"]; // 快速创建一个NSArray数组

2、数组的访问 

1 NSArray *array4 = @[@"jack", @"rose", @"4324324"];
2 NSLog(@"%ld", array4.count);//输出数组元素个数
3 NSLog(@"%@", [array4 objectAtIndex:1]); //访问数组中索引为1的元素
4 NSLog(@"%@", array4[0]);//访问数组中索引为0的元素
5 NSLog(@"last =%@",[array4 lastObject]);  //访问数组中的最后一个元素
6 NSLog(@"first = %@",[array4 firstObject]); //访问数组的的第一个元素

3、数组的遍历

 1 //1.常规遍历
 2 NSArray *arr = [NSArray arrayWithObjects:@"jjj",@"ddd",@"yyy",@"vvv", nil];
 3 for (int i = 0; i < arr.count; i++) {
 4 NSLog(@“%@",arr[i]);
 5 }
 6 //2.增强for循环
 7 for (NSObject *obj in arr ) {
 8   NSLog(@"obj = %@",obj);
 9 }
10 //3.OC迭代器
11 [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
12 if (idx == 2) {
13 *stop = YES;
14 }
15 NSLog(@"obj =%@,idx = %lu",obj,idx);
16 }];

4、自定对象数组方法调用  

 1 //假设person类中有say 和 sayWithName:withObject方法
 2 - (void)say
 3 {
 4     NSLog(@"加油");
 5 }
 6 - (void)sayWithName:(NSString *)name
 7 {
 8     NSLog(@"%@ 加油", name);
 9 }
10 NSArray *arr1 = @[p,p1,p2,p3,p4];
11 //第一种方式 调用无参的
12 [arr1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
13 [obj say];
14 }]
15 //第二种方式 调用无参的
16 [arr1 makeObjectsPerformSelector:@selector(say)];
17 //调用有参的
18 [arr1 makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"tg" ];

5、数组的排序

 1 //1.OC对象数组的排序
 2 NSArray *arr = [NSArray arrayWithObjects:@81,@22,@53,@34,@8, nil];
 3 //数组的排序方法 sortedArrayUsingSelector
 4 NSArray *newStr = [arr sortedArrayUsingSelector:@selector(compare:)];
 5 NSLog(@"%@",newStr); //输出结果:8,22,34,53,81
 6 //2.自定义对象数组的排序
 7 Person *p = [[Person alloc]init];
 8 p.age = 14 ;
 9 Person *p1 = [[Person alloc]init];
10 p1.age = 210 ;
11 Person *p2 = [[Person alloc]init];
12 p2.age = 50 ;
13 Person *p4 = [[Person alloc]init];
14 p4.age = 20 ;
15 Person *p3 = [[Person alloc]init];
16 p3.age = 54 ;
17 NSArray *arr =@[p,p1,p2,p3,p4];
18 NSArray *newArr = [arr  sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
19     return obj1.age > obj2.age; // 二分法
20 }];
21 NSLog(@“输出排序后的数组%@",newArr);

6、NSArray和NSString之间的转换

  1)数组之间的元素用"-"连接

1 //数组元素之间用-相连
2 NSArray *arr = @[@"lnj",@"lmj",@"jjj"];
3 NSMutableString *strM = [NSMutableString string];
4 for(NSString *str in arr ) {
5 [strM appendString:str];
6 [strM appendString:@"-"];
7 }
8 [strM deleteCharactersInRange:NSMakeRange(strM.length-1, 1)];
9 NSLog(@"%@",strM); //输出结果:lnj-lmj-jjj

  2)数组之间的元素用"**"连接

1 NSArray *arr = @[@"lnj",@"lmj",@"jjj"];
2 NSString *str = [arr componentsJoinedByString:@"**"];
3 NSLog(@"str = %@",str);  //输出结果:str = lnj**lmj**jjj

  3)将一个字符串切割成数组

1 //将一个字符串切割成数组
2 NSString *str = @"lnj*lmj*zyt";
3 NSArray *arr = [str componentsSeparatedByString:@"*"];
4 NSLog(@"arr = %@",arr);

 

 7、数组的读写

  1)将数组写入到文件中

 1 //数组中的元素须是Foundation框架中得OC对象
 2 NSArray *arr = @[@"rty",@"xds",@"yer"];
 3 BOOL flag =[arr writeToFile:@"/Users/tangge/Desktop/赵玉堂.plist" atomically:YES];
 4 NSLog(@"flag = %d",flag);
 5 
 6 //数组元素是自定义对象不能写入到文件中
 7 Person *p = [[Person alloc] init];
 8 p.age = 13;
 9 Person *p1 = [[Person alloc] init];
10 p.age = 25;
11 Person *p2 = [[Person alloc] init];
12 p.age = 34;
13 Person *p3 = [[Person alloc] init];
14 NSArray *arr = @[p,p1,p2,p3,p4,p5];
15 bool flag = [arr writeToFile:@"/Users/tangge/DeskTop/堂哥.plist" atomically:YES ];  //报错
16 NSLog(@"%d",flag);  

  2)从文件中读取数组

1 NSString *path = @"/Users/tangge/DeskTop/赵玉堂.plist";
2 NSArray *arr = [NSArray arrayWithContentsOfFile:path];
3 NSLog(@"%@",arr);

8、判断一个数组是否包含某一元素

1 NSArray *arr = [NSArray arrayWithObjects:@"zyt",@"yyu",@"zjj", nil];
2 if ([arr containsObject:@"yt"]) {
3     //包含返回YES,否则包含NO
4     NSLog(@"arr中包含zyt");
5 }
6 else
7 {
8     NSLog(@"arr中不包含zs");
9 }      

 

 

二、NSMutableArray

概述:NSMutableArray是NSArray的子类,NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素,NSMutableArray是可变的,随时可以往里面添加\更改\删除元素。

1、NSMutableArray的创建

1 NSMutableArray *array = [NSMutableArray array]; //创建一个空的可变数组
2 NSMutableArray *array = [NSMutableArray arrayWithObject:@"zyt"];//创建含一个元素的可变数组
3 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil]; //创建含有多个元素可变数组

2.NSMutableArray基本使用

 1 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil]; //创建一个可变数组
 2 [array addObjectsFromArray:@[@"zyt",@"ttt",@"ggg"]];//将指定数组中得元素都取出来,放到array中,并不是将整个数组作为一个元素添加arrM数组中
 3 [array addObject:@“jack"];  //向数组添加一个元素,不能向数组中添加空元素 [array addObject:nil]
 4 [array addObject:@[@“lmj",@"lng"]]; //以下是将整个数组作为一个元素推添加
 5 [array insertObject:@"XCQ" atIndex:0];   //通过指定索引向array中插入一个元素
 6 [array removeAllObjects];  // 删除数组所有元素
 7 [array removeObject:@"jack"];// 删除指定的对象
 8 [array removeObjectAtIndex:0];//删除索引对应位置的元素
 9 [array removeLastObject];  // 删除最后一个元素
10 [array replaceObjectAtIndex:0 withObject:@“C"]; //替换指定索引位置的元素
11 array[0] = @"wwwww";//替换指定位置的元素
12 //插入一组数数据,指定数组需要插入的位置 和 需要插入的个数
13 NSRange range = NSMakeRange(0, 2);
14 NSIndexSet *set =[NSIndexSet indexSetWithIndexesInRange:range];
15 [array insertObjects:@[@"A",@"B"] atIndexes:set];

 

3、NSArray和NSMutableArray比较

NSArray是可变的,NSMutableArray是不可变的。NSMutableArray不能通过@[]来创建一个不可变数组,因为@[]创建出来的是一个不可变数组,如果把一个不可变数组当做一个可变数组会引发一个运行时错误。

 

posted @ 2015-07-07 14:50  英雄出少年  阅读(297)  评论(0编辑  收藏  举报