我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArray类是不可变的,NSMutableArray类是可变的。下面就先来看一下NSArray类

 

一、NSArray类

  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的创建

  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对象,结果:

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

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

  1. //使用类方法创建
  2. array1 = [NSArray arrayWithObjects:s1,s2,s3, nil];
  3. //创建一个数组,将源数组中的数据拿出来放进去
  4. NSArray *array2 = [NSArray arrayWithArray:array1];

2、使用下标访问元素

  1. //2.----------------------objectAtIndex
  2. //访问数组中的数据,数组中存放的是对象的指针
  3. NSString *str1 = [array1 objectAtIndex:0];

3、获取数组的大小

  1. //3.----------------------count
  2. //获取数组元素中的个数
  3. NSUInteger count = [array1 count];//返回的是一个无符号数值

NSUInteger是无符号的int类型

4、是否包含某一个元素

  1. //4.----------------------containsObject
  2. //判断数组中是否包含某一个对象,判断的是指针对象值,不是对象中的值
  3. BOOL isContains = [array1 containsObject:@"zhangsan"];

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

  1. //5.----------------------indexOfObject
  2. //返回一个对象在数组中的下标值
  3. NSUInteger index = [array1 indexOfObject:@"zhangsan"];
  4. if(index == NSNotFound){
  5. //没有找到
  6. }else{
  7. //找到了
  8. }

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

  1. #define NSIntegerMax    LONG_MAX

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

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

  1. //6.----------------------componentsJoinedByString
  2. //数组中存放的如果是字符串的话,可以使用连接符将其所有的元素进行连接
  3. //注意数组中的元素必须都是字符串
  4. NSString *content = [array1 componentsJoinedByString:@","];

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

  1. //8.----------------------arrayByAddingObject
  2. //在原来的数组后面追加元素,返回一个新的数组对象,因为他是不可变的
  3. NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];

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

8、数组的遍历

  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快速创建的一种方式

  1. //xcode4.4以后,编译器对数组的创建和访问语法做了优化
  2. NSArray *array7 = @[s1,s2,s3];
  3. NSString *s = array7[0];

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

二、NSMutableArray类

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、创建方法

  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、添加元素

  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方法是讲一个数组整个都添加到指定的数组中了,那么这个数组就变成二维数组了

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

下面是运行结果:

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

  1. //3.---------------------insertObject
  2. //在指定的位置上插入特定元素
  3. [mArray2 insertObject:@"def" atIndex:0];

4、替换元素

  1. //4.---------------------replaceObjectAdIdex
  2. //替换元素
  3. [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];

5、互换两个元素的位置

  1. //5.---------------------exchangeObjectAtIndex
  2. //互换两个元素的位置
  3. [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];

6、删除方法

  1. //6.---------------------removeObjectAdIndex
  2. //删除指定位置的元素
  3. [mArray2 removeObjectAtIndex:0];
  4. //删除最后一个元素
  5. [mArray2 removeLastObject];
  6. //删除指定的对象
  7. [mArray2 removeObject:@"lisi"];
  8. //删除所有的对象/清空列表
  9. [mArray2 removeAllObjects];

总结

这篇文章就介绍了Foundation框架中的NSArray类和NSMutableArray类,他们是用来存放一些指定类型的元素的

注:OC中没有泛型的概念,所以对于数组中存放了不同类型的值,在运行的时候会报错的,这个和Java相比,操作集合类的时候安全性就差了点。所以我们在操作集合类的时候需要注意的地方。

OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类的更多相关文章

  1. (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...

  2. (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...

  3. OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于J ...

  4. (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...

  5. (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...

  6. (转载)OC学习篇之---Foundation框架中的NSObject对象

    前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...

  7. OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutabl ...

  8. OC学习篇之---Foundation框架中的NSObject对象

    从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现 ...

  9. OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/4 ...

随机推荐

  1. windows下go语言环境

    1  liteIDE ,随便装哪儿都行 2  GO语言包 安装  ,我安装到了 c:\go  (顺便给个地址下载地址  https://golang.org/dl/  ) 3  GCC编译器 安装,同 ...

  2. C_深入(内存模型)

    01 数据类型: 为什么有数据类型? 现实生活中的数据太多而且大小形态不一. 数据类型与内存的关系: 数据类型的本质:创建变量的模具,是固定大小的别名. #include "stdio.h& ...

  3. traceroute----追踪数据包在网络上的传输过程

    traceroute命令 用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节. traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间.一条路径上的每 ...

  4. 【习题 8-11 UVA - 1615】Highway

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个村庄都有一个范围[li..ri] 只要在这个范围内放点都可以"支配"这个村庄. 则问题就等价于线段上有n个区 ...

  5. ZOJ 3587 Marlon&#39;s String 扩展KMP

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3587 题意:给出两个字符串S和T.S,T<=100000.拿出 ...

  6. HDU 1043 八数码(A*搜索)

    在学习八数码A*搜索问题的时候须要知道下面几个点: Hash:利用康托展开进行hash 康托展开主要就是依据一个序列求这个序列是第几大的序列. A*搜索:这里的启示函数就用两点之间的曼哈顿距离进行计算 ...

  7. 【剑指Offer学习】【面试题49:把字符串转换成整数】

    题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能.不能使用atoi或者其它相似的库函数. 题目解析 这看起来是非常easy的题目,实现基本功能 ,大部分人都能用10行之内的代码 ...

  8. Android学习笔记进阶15之Shader渲染

    Android提供的Shader类主要是渲染图像以及一些几何图形. Shader有几个直接子类: BitmapShader    : 主要用来渲染图像 LinearGradient  :用来进行线性渲 ...

  9. JAVA Mail邮件实现发送

    package com.test;import java.util.Date;import java.util.Properties;import javax.mail.Message;import ...

  10. linux网络防火墙-iptables基础详解

    一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防火墙 ...