在以前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类:java
http://blog.csdn.net/jiangwei0910410003/article/details/41788223数组
今天咱们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差很少,算是一种数据结构,固然咱们从这两个类能够看到,NSArray类是不可变的,NSMutableArray类是可变的。下面就先来看一下NSArray类xcode
1、NSArray类安全
// // main.m // 16_NSArray // // Created by jiangwei on 14-10-12. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> //NSArray中不能够存放基本数据类型,只能存放类的实例,若是须要将基本类型、结构体放入到数组中得话, //须要经过NSNumber/NSValue进行数据的封装,同时不能在NSArray中存储nil int main(int argc, const char * argv[]) { @autoreleasepool { //1.---------------------数组的建立 NSString *s1 = @"zhangsan"; NSString *s2 = @"lisi"; NSString *s3 = @"wangwu"; //最后的nil至关于结束的标记 NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil]; //打印的时候会调用description方法 //至关于:array1.description NSLog(@"%@",array1); //使用类方法建立 array1 = [NSArray arrayWithObjects:s1,s2,s3, nil]; //建立一个数组,将源数组中的数据拿出来放进去 NSArray *array2 = [NSArray arrayWithArray:array1]; //2.----------------------objectAtIndex //访问数组中的数据,数组中存放的是对象的指针 NSString *str1 = [array1 objectAtIndex:0]; //3.----------------------count //获取数组元素中的个数 NSUInteger count = [array1 count];//返回的是一个无符号数值 //4.----------------------containsObject //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值 BOOL isContains = [array1 containsObject:@"zhangsan"]; //5.----------------------indexOfObject //返回一个对象在数组中的下标值 NSUInteger index = [array1 indexOfObject:@"zhangsan"]; if(index == NSNotFound){ //没有找到 }else{ //找到了 } //6.----------------------componentsJoinedByString //数组中存放的若是是字符串的话,可使用链接符将其全部的元素进行链接 //注意数组中的元素必须都是字符串 NSString *content = [array1 componentsJoinedByString:@","]; //7.----------------------lastObject //访问数组最后一个元素 NSString *lastObj = [array1 lastObject]; //8.----------------------arrayByAddingObject //在原来的数组后面追加元素,返回一个新的数组对象,由于他是不可变的 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); } //xcode4.4之后,编译器对数组的建立和访问语法作了优化 NSArray *array7 = @[s1,s2,s3]; NSString *s = array7[0]; } return 0; }下面来看一下他的操做方法:
一、NSArray的建立数据结构
//1.---------------------数组的建立 NSString *s1 = @"zhangsan"; NSString *s2 = @"lisi"; NSString *s3 = @"wangwu"; //最后的nil至关于结束的标记 NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil]; //打印的时候会调用description方法 //至关于:array1.description NSLog(@"%@",array1);咱们看到他的initWithObjects方法的最后一个值为nil,这个咱们在以前说到过这个值,他是空指针的意思,和Java中的null同样的,这里为何在建立NSArray的时候最后一个值为空呢?这个和C语言中的场景是相似的,C语言中字符串的结束符为'/0',那么这里的NSArray的最后一个元素为nil,缘由是标记NSArray结束了。
而后咱们调用NSLog方法打印NSArray对象,结果:框架
咱们看到了,会打印出很是格式化的数据出来,这个缘由是由于NSLog打印对象的时候会调用其description方法,和Java中的toString方法同样,固然咱们能够重写这个方法的,后面会说到。优化
咱们还可使用类方法建立NSArray:spa
//使用类方法建立 array1 = [NSArray arrayWithObjects:s1,s2,s3, nil]; //建立一个数组,将源数组中的数据拿出来放进去 NSArray *array2 = [NSArray arrayWithArray:array1];
二、使用下标访问元素.net
//2.----------------------objectAtIndex //访问数组中的数据,数组中存放的是对象的指针 NSString *str1 = [array1 objectAtIndex:0];
//3.----------------------count //获取数组元素中的个数 NSUInteger count = [array1 count];//返回的是一个无符号数值NSUInteger是无符号的int类型
四、是否包含某一个元素指针
//4.----------------------containsObject //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值 BOOL isContains = [array1 containsObject:@"zhangsan"];
//5.----------------------indexOfObject //返回一个对象在数组中的下标值 NSUInteger index = [array1 indexOfObject:@"zhangsan"]; if(index == NSNotFound){ //没有找到 }else{ //找到了 }这里咱们看到用到了一个系统常量:NSNotFound,咱们能够看到他的定义:
#define NSIntegerMax LONG_MAX看到了,是一个Long类型的最大值。
六、使用指定的链接符链接数组中全部的元素
//6.----------------------componentsJoinedByString //数组中存放的若是是字符串的话,可使用链接符将其全部的元素进行链接 //注意数组中的元素必须都是字符串 NSString *content = [array1 componentsJoinedByString:@","];
//8.----------------------arrayByAddingObject //在原来的数组后面追加元素,返回一个新的数组对象,由于他是不可变的 NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];由于NSArray是不可变的,因此会产生一个新的NSArray对象,返回回来
八、数组的遍历
//数组的遍历 for(int i=0;i<array1.count;i++){ NSString *str = [array1 objectAtIndex:i]; NSLog(@"%@",str); } //快速遍历 for(NSString *s in array1){ NSLog(@"%@",s); }第二种方式和Java中的快速遍历是同样的。
九、Xcode4.4以后新增了NSArray快速建立的一种方式
//xcode4.4之后,编译器对数组的建立和访问语法作了优化 NSArray *array7 = @[s1,s2,s3]; NSString *s = array7[0];这种方式比以前的建立方式又快又方便,并且符合正常的建立方式,访问的时候也是能够直接用下标进行获取元素
2、NSMutableArray类
NSArray类是不可变的,NSMutableArray类是可变的,可变类同样的特性,就是能够进行增删改查操做
// // main.m // 17_NSMutableArray // // Created by jiangwei on 14-10-12. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> //NSMutableArray继承NSArray类,有NSArray中的全部方法 int main(int argc, const char * argv[]) { @autoreleasepool { //1.---------------------建立可变数组 NSString *str1 = @"zhangsan"; NSString *str2 = @"lisi"; NSString *str3 = @"wangwu"; NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil]; //下面的这种方式建立的数组是错误的 //下面的这种方式是建立不可变数组的方式,不能哟关于可变数组的建立 //NSMutableArray *array1 = @[str1,str2,str3]; //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间 NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5]; //使用类方法建立 NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5]; //2.---------------------addObject //添加元素的方法 [mArray1 addObject:str1]; [mArray1 addObject:str2]; //添加数组,把mArray1中的全部元素所有添加到mArray2中 [mArray2 addObjectsFromArray:mArray1]; NSLog(@"mArray3 = %@",mArray2); //二维数组 //这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了 [mArray2 addObject:mArray1]; //3.---------------------insertObject //在指定的位置上插入特定元素 [mArray2 insertObject:@"def" atIndex:0]; //4.---------------------replaceObjectAdIdex //替换元素 [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"]; //5.---------------------exchangeObjectAtIndex //互换两个元素的位置 [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3]; //6.---------------------removeObjectAdIndex //删除指定位置的元素 [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]; //下面的这种方式建立的数组是错误的 //下面的这种方式是建立不可变数组的方式,不能用于可变数组的建立 //NSMutableArray *array1 = @[str1,str2,str3]; //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间 NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5]; //使用类方法建立 NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];建立方式和NSArray相似,可是有一种方式不能用,就是直接建立的方式,那个只能用于建立不变数组。
可是可变数组还有一个方法就是可以事先的设置数组的大小,并且超过这个大小以后,数组会自动扩充,相似于C语言中的动态数组的实现。
二、添加元素
//2.---------------------addObject //添加元素的方法 [mArray1 addObject:str1]; [mArray1 addObject:str2]; //添加数组,把mArray1中的全部元素所有添加到mArray2中 [mArray2 addObjectsFromArray:mArray1]; NSLog(@"mArray3 = %@",mArray2); //二维数组 //这个是将mArray1添加到mArray2数组中,这样mArray2就变成了二维数组了 [mArray2 addObject:mArray1]; NSLog(@"mArray3 = %@",mArray2);使用addObjectsFromArray方法是将一个数组中的每一个元素添加到指定的数组中
使用addObject方法是讲一个数组整个都添加到指定的数组中了,那么这个数组就变成二维数组了
这个两个方法要区分一下~~
下面是运行结果:
//3.---------------------insertObject //在指定的位置上插入特定元素 [mArray2 insertObject:@"def" atIndex:0];
//4.---------------------replaceObjectAdIdex //替换元素 [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];
//5.---------------------exchangeObjectAtIndex //互换两个元素的位置 [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];
//6.---------------------removeObjectAdIndex //删除指定位置的元素 [mArray2 removeObjectAtIndex:0]; //删除最后一个元素 [mArray2 removeLastObject]; //删除指定的对象 [mArray2 removeObject:@"lisi"]; //删除全部的对象/清空列表 [mArray2 removeAllObjects];
这篇文章就介绍了Foundation框架中的NSArray类和NSMutableArray类,他们是用来存放一些指定类型的元素的
注:OC中没有泛型的概念,因此对于数组中存放了不一样类型的值,在运行的时候会报错的,这个和Java相比,操做集合类的时候安全性就差了点。因此咱们在操做集合类的时候须要注意的地方。