OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArray类是不可变的,NSMutableArray类是可变的。下面就先来看一下NSArray类
一、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 charchar * argv[]) {
- @autoreleasepool {
- //1.---------------------数组的创建
- NSString *s1 = @"zhangsan";
- NSString *s2 = @"lisi";
- NSString *s3 = @"wangwu";
- //最后的nil相当于结束的标记
- NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil];
- //打印的时候会调用description方法
- //相当于:array1.description
- NSLog(@"%@",array1);
- //使用类方法创建
- array1 = [NSArray arrayWithObjects:s1,s2,s3, nil 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;
- }
下面来看一下他的操作方法:
1、NSArray的创建
- //1.---------------------数组的创建
- NSString *s1 = @"zhangsan";
- NSString *s2 = @"lisi";
- NSString *s3 = @"wangwu";
- //最后的nil相当于结束的标记
- NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil];
- //打印的时候会调用description方法
- //相当于:array1.description
- 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、使用下标访问元素
- //2.----------------------objectAtIndex
- //访问数组中的数据,数组中存放的是对象的指针
- NSString *str1 = [array1 objectAtIndex:0];
3、获取数组的大小
- //3.----------------------count
- //获取数组元素中的个数
- NSUInteger count = [array1 count];//返回的是一个无符号数值
NSUInteger是无符号的int类型
4、是否包含某一个元素
- //4.----------------------containsObject
- //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值
- BOOL isContains = [array1 containsObject:@"zhangsan"];
5、找到一个元素在数组中的下标
- //5.----------------------indexOfObject
- //返回一个对象在数组中的下标值
- NSUInteger index = [array1 indexOfObject:@"zhangsan"];
- if(index == NSNotFound){
- //没有找到
- }else{
- //找到了
- }
这里我们看到用到了一个系统常量:NSNotFound,我们可以看到他的定义:
- #define NSIntegerMax LONG_MAX
看到了,是一个Long类型的最大值。
6、使用指定的连接符连接数组中所有的元素
- //6.----------------------componentsJoinedByString
- //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接
- //注意数组中的元素必须都是字符串
- NSString *content = [array1 componentsJoinedByString:@","];
7、在数组的尾部增加一个元素
- //8.----------------------arrayByAddingObject
- //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的
- 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快速创建的一种方式
- //xcode4.4以后,编译器对数组的创建和访问语法做了优化
- NSArray *array7 = @[s1,s2,s3];
- NSString *s = array7[0];
这种方式比之前的创建方式又快又方便,而且符合正常的创建方式,访问的时候也是可以直接用下标进行获取元素
二、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 charchar * argv[]) {
- @autoreleasepool {
- //1.---------------------创建可变数组
- NSString *str1 = @"zhangsan";
- NSString *str2 = @"lisi";
- NSString *str3 = @"wangwu";
- NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil 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、创建方法
- //1.---------------------创建可变数组
- NSString *str1 = @"zhangsan";
- NSString *str2 = @"lisi";
- NSString *str3 = @"wangwu";
- NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil nil];
- //下面的这种方式创建的数组是错误的
- //下面的这种方式是创建不可变数组的方式,不能用于可变数组的创建
- //NSMutableArray *array1 = @[str1,str2,str3];
- //先开辟5个空间,用于存储元素,当存储的元素超过了5个,数组会自动增大空间
- NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];
- //使用类方法创建
- NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];
创建方式和NSArray类似,但是有一种方式不能用,就是直接创建的方式,那个只能用于创建不变数组。
但是可变数组还有一个方法就是能够事先的设置数组的大小,而且超过这个大小之后,数组会自动扩充,类似于C语言中的动态数组的实现。
2、添加元素
- //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、在数组的指定位置上插入元素
- //3.---------------------insertObject
- //在指定的位置上插入特定元素
- [mArray2 insertObject:@"def" atIndex:0];
4、替换元素
- //4.---------------------replaceObjectAdIdex
- //替换元素
- [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];
5、互换两个元素的位置
- //5.---------------------exchangeObjectAtIndex
- //互换两个元素的位置
- [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];
6、删除方法
- //6.---------------------removeObjectAdIndex
- //删除指定位置的元素
- [mArray2 removeObjectAtIndex:0];
- //删除最后一个元素
- [mArray2 removeLastObject];
- //删除指定的对象
- [mArray2 removeObject:@"lisi"];
- //删除所有的对象/清空列表
- [mArray2 removeAllObjects];
总结
这篇文章就介绍了Foundation框架中的NSArray类和NSMutableArray类,他们是用来存放一些指定类型的元素的
注:OC中没有泛型的概念,所以对于数组中存放了不同类型的值,在运行的时候会报错的,这个和Java相比,操作集合类的时候安全性就差了点。所以我们在操作集合类的时候需要注意的地方。
OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类的更多相关文章
- (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...
- (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)
前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...
- OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)
1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于J ...
- (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...
- (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...
- (转载)OC学习篇之---Foundation框架中的NSObject对象
前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...
- OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutabl ...
- OC学习篇之---Foundation框架中的NSObject对象
从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现 ...
- OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/4 ...
随机推荐
- POJ 3049 DFS
思路:暴搜 //By SiriusRen #include <cstdio> #include <iostream> #include <algorithm> us ...
- Android 关于编译ijkplayer下的so经验分享
前言:公司最近需要做直播方面的技术调研,所以需要去研究播放器相关的技术:刚好本人github上收藏了ijkplayer,之前一直没有研究过,现在刚好clone下来研究研究. 我先在Windows安装c ...
- vim--学习之emmet插件前端开发
Emmet 在vim的使用: 1.嵌套 <ctr+y>+,(ctr+y+逗号三者的组合键,ctr+y一起按在按逗号)相当于Ememet中的Tab键. 2.内容的包围: 写好内容,退出编辑模 ...
- HDU 1576 A/B 数论水题
http://acm.hdu.edu.cn/showproblem.php?pid=1576 写了个ex_gcd的模板...太蠢导致推了很久的公式 这里推导一下: 因为 1 = BX + 9973Y ...
- POJ 2079 Triangle 旋转卡壳求最大三角形
求点集中面积最大的三角形...显然这个三角形在凸包上... 但是旋转卡壳一般都是一个点卡另一个点...这种要求三角形的情况就要枚举底边的两个点 卡另一个点了... 随着底边点的递增, 最大点显然是在以 ...
- angularjs之ui-bootstrap的Datepicker Popup不使用JS实现双日期选择控件
最开始使用ui-bootstrap的Datepicker Popup日期选择插件实现双日期选择时间范围时,在网上搜了一些通过JS去实现的方法,不过后来发现可以不必通过JS去处理,只需要使用其自身的属性 ...
- Linux网卡驱动框架及制作虚拟网卡
1.概述 网卡驱动与硬件相关,主要负责收发网络的数据包,将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议. 网卡设备与字符设备,块设备不同,网络设备驱动程序 ...
- Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的
前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新项目正 ...
- 解决 Visual Studio 2013、2015、2017 工具箱不显示ArcGIS 10.2 控件,及ArcGIS模板丢失问题
1.重装ArcObject SDK for .NET Framework方法 (1)问题描述: 环境:WIN10 64bit.Visual Studio 2013.ArcGIS10.1.ArcGIS ...
- SDNU 1206.蚂蚁感冒 【代码如此简单,思维练习】【7月29】
蚂蚁感冒 Description 长100厘米的细长直杆子上有n仅仅蚂蚁. 它们的头有的朝左,有的朝右. 每仅仅蚂蚁都仅仅能沿着杆子向前爬,速度是1厘米/秒. 当两仅仅蚂蚁碰面时.它们会同一时候掉头往 ...