当前位置: 代码迷 >> 综合 >> Objective-C学习-数组 NSArray 和 NSMutableArray
  详细解决方案

Objective-C学习-数组 NSArray 和 NSMutableArray

热度:9   发布时间:2024-01-04 06:45:48.0
在学习 Objective-C的过程中,感觉数组在这一个学习方面是一个比较大的应用域,所以写这篇随笔来总结一下。

  首先声明的是,与C语言的数组不同,Objective-C的是数组只能用来存储对象,而不是存储int 、double、char等基础数据类型,一般要存这些基础数据类型,对于我这个刚学 Objective-C的新手来说,我的做法是将有关数字的基础类型 如 int 、double、char首先转换成一个叫做 NSNumber的类  char*类型的转换成  Objective-C的字符串  NSString 类来进行储存,相关 NSNumber 和 NSString 在以后我学习到的时候会来总结一下我的学习成果。

 

 

       Objective-C的数组分为两种,一种叫做不可变数组(NSArray),一种叫做可变数组(NSMutableArray),NSMutableArray类是NSArray类的一个子类。

  (1)不可变数组(NSArray) ---------该类型在确定之后,不能进行数组元素的更改以及交换

   

/
//  main.m
//  NSArray(不可变数组) 博客
//
//  Created by YueWen on 15/9/8.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {/**不可变数组 NSArray*//*数组的常用的基本初始化*///objc方式的创建对象的普遍方法,init是NSObject的方法,几乎所有的类都是继承于NSObject 类NSArray * array1 = [[NSArray alloc] init];//这种创建对象的方法与上面实质是相同的,只不过上面的是便利初始化函数,下面的是便利构造器来创建,下面就不再注释是便利初始化函数还是便利构造器NSArray * array2 = [NSArray array];//一种和java 一样的创建对象的方法,刚从java 转过来的程序员会比较青睐与这种初始化NSArray * array3 = [NSArray new];//根据数组 array1 来创建数组对象 array4 和 array5NSArray * array4 =[[NSArray alloc]initWithArray:array1];NSArray * array5 = [NSArray arrayWithArray:array1];//通过方法来初始化数组里面的数据,注意后面不要丢了nilNSArray * array6 = [[NSArray alloc]initWithObjects:@"Run",@"Into",@"Love",nil];NSArray * array7 = [NSArray arrayWithObjects:@"Run",@"Into",@"Love",nil];//最简洁的直接赋值创建数组NSArray * array8 = @[@"Run",@"Into",@"Love"];/*不可变数组的 常用方法*//***  在array8的所有的元素后面,追加一个元素@“Yue”,返回给array9*  此时 array9 的元素的个数为4  元素分别为 @“Run” @"Into" @"Love" @"Yue"*  注:必须要有一个数组来接收返回值 ,不可变数组是不能改变自身的,执行完方法之后,array8是没有任何变化的*/NSArray * array9 = [array8 arrayByAddingObject:@"Yue"];/***  在array8的所有的元素后面,追加 数组 的所有的元素 返回给array10*  此时 array10 的元素的个数为10 元素分别为 @“Run” @"Into" @"Love" @"Run" @"Into" @"Love"*/NSArray * array10 = [array8 arrayByAddingObjectsFromArray:array8];/***  将 array8 的所有的元素 通过 @"_"连接起来,组成一个字符串对象*  结果是: s = Run_Into_Love*/NSString * s = [array8 componentsJoinedByString:@"_"];/***  判断数组 array8 中是否有  值为@“Run”的 NSString 对象(不一定必须是字符串,因为数组中可以存各种对象)*  结果是: contain = YES;*/BOOL contain = [array8 containsObject:@"Run"];/***  返回的是 值为@“Love” 的 NSString 对象 在数组 array8中的下标数*  结果是: index1 = 2;*/NSInteger index1 = [array8 indexOfObject:@"Love"];/***  比较两个数组是否相同*  结果是: isEqual = NO;*/BOOL isEqual = [array8 isEqualToArray:array9];/***  返回的是数组 array8 的第一个元素对象*  结果是:firstObject = @"Run"*/NSString * firstObject = [array8 firstObject];/***  返回的是数组 array8 的最后一个元素对象*  结果是:lastObject = @"Love"*/NSString * lastObject = [array8 lastObject];/***  获取数组 array8 中下标为1的元素对象*  结果是:object = @"Into"*/NSString * object = [array8 objectAtIndex:1];return 0;
}


 

  (2)可变数组(NSMutableArray)-------该类型在确定之后,可以进行元素的增、删、改(包括元素的位置 以及 数组的元素个数)  


//
//  main.m
//  NSMutableArray (可变数组)博客
//
//  Created by YueWen on 15/9/9.
//  Copyright (c) 2015年 YueWen. All rights reserved.
//#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {/***  可变数组*//*可变数组的常用初始化方法*///objc方式的创建对象的普遍方法,init是NSObject的方法,几乎所有的类都是继承于NSObject 类NSMutableArray * mArray1 = [[NSMutableArray alloc]init];//使用 可变数组 的 便利构造器 来完成初始化NSMutableArray * mArray2 = [NSMutableArray array];//一种和java 一样的创建对象的方法,刚从java 转过来的程序员会比较青睐与这种初始化NSMutableArray * mArray3 = [NSMutableArray new];//根据数组 mArray1 来创建 数组对象 mArray4NSMutableArray * mArray4 = [[NSMutableArray alloc]initWithArray:mArray1];NSMutableArray * mArray5 = [NSMutableArray arrayWithArray:mArray1];//初始化数组的时候 默认的元素个数是3个  但是对于可变数组无所谓,因为后面是可以加的NSMutableArray * mArray6 = [[NSMutableArray alloc]initWithCapacity:3];NSMutableArray * mArray7 = [NSMutableArray arrayWithCapacity:3];//通过事先放入几个元素对象 来完成初始化,但是一定不要忘记后面的nilNSMutableArray * mArray8 = [[NSMutableArray alloc]initWithObjects:@"Run",@"Into",@"Love",nil];NSMutableArray * mArray9 = [NSMutableArray arrayWithObjects:@"Run",@"Into",@"Love", nil];/***  可变数组 的常用数据处理方法*  以下实例用 原型用mArray9*//***  为数组添加元素,实例是在数组最后添加元素@“Yue”*  方法执行前:mArray9 = @[@"Run",@"Into",@"Love"]*  方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@"Yue"]*/[mArray9 addObject:@"Yue"];/***  为数组添加元素,与上例不同的是,是将mArray8的所有的元素都追加到mArray9中*  方法执行前:mArray9 = @[@"Run",@"Into",@"Love",@"Yue"]*  方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@“Yue”,@“Run”,@“Into”,@"Love"]*/[mArray9 addObjectsFromArray:mArray8];/***  将数组的最后一个元素对象从数组中删除*  方法执行前:mArray9 = @[@"Run",@"Into",@"Love",@“Yue”,@“Run”,@“Into”,@"Love"]*  方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@“Yue”,@“Run”,@“Into”]*/[mArray9 removeLastObject];/***  删除数组中存在的某个对象,如果这个对象存在多个相同的,都会被删除*  方法执行前:mArray9 = @[@"Run",@"Into",@"Love",@“Yue”,@“Run”,@“Into”]*  方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@“Run”,@“Into”]*/[mArray9 removeObject:@"Yue"];/***  删除数值中的存在的某个对象。只不过相比上一个方法,该方法存在范围**  @param 1 表示从下标为(包含)的元素对象开始查找*  @param 3 表示查找的个数**  方法执行后前:mArray9 = @[@"Run",@"Into",@"Love",@“Run”,@“Into”]*  该方法表示 从 @“Into”开始,查找往后的3个,如果存在@“Run”,就删除,没有就不作为*  方法执行后:mArray9 = @[@"Run",@"Into",@"Love",@“Into”]*/[mArray9 removeObject:@"Run" inRange:NSMakeRange(1, 3)];/***  表示删除数组中下标为3 的元素对象  (使用这个方法小心数组越界)*  方法执行前:mArray9 = @[@"Run",@"Into",@"Love",@“Into”]*  方法执行后:mArray9 = @[@"Run",@"Into",@"Love"]*/[mArray9 removeObjectAtIndex:3];/***  表示从mArray9中删除所有的mArray8 存在的对象元素*  因为mArray8 和 mArray9 中的元素相同,所以执行完毕后 数组mArray9中没有任何元素了*  方法执行前:mArray9 = @[@"Run",@"Into",@"Love"]*  方法执行后:mArray9 = @[]*/[mArray9 removeObjectsInArray:mArray8];/***  表示从mArray8中删除范围的元素**  @param 0 从下标为0的元素开始*  @param 2 删除元素的个数**  方法执行前:mArray8 = @[@"Run",@"Into",@"Love"]*  方法执行后:mArray8 = @[@"Love"]*/[mArray8 removeObjectsInRange:NSMakeRange(0, 2)];/***  删除数组mArray8中的所有的对象元素*  方法执行前:mArray8 = @[@"Love"]*  方法执行后:mArray8 = @[]*/[mArray8 removeAllObjects];//因为数组的元素都已经没有,所以初始化一个,为后面的实例继续做例子[mArray9 addObjectsFromArray:@[@"Run",@"Into",@"Love"]];/***  表示在可变数组中插入对象元素*  在下标为2的位置插入一个@”Yue“的字符串对象*  方法执行前:mArray9 = @[@"Run",@"Into",@"Love"]*  方法执行后:mArray9 = @[@"Run",@"Into",@"Yue",@"Love"]*/[mArray9 insertObject:@"Yue" atIndex:2];/***  表示在可变数组中替换对象元素*  将下标为2的位置的元素 用字符串对象@“Wen”替换*  方法执行前:mArray9 = @[@"Run",@"Into",@"Yue",@"Love"]*  方法执行后:mArray9 = @[@"Run",@"Into",@"Wen",@"Love"]*/[mArray9 replaceObjectAtIndex:2 withObject:@"Wen"];/***  表示将可变数组中的对象元素交换位置*  将下标为2位置的元素 和 下标为3位置的元素 交换位置*  方法执行前:mArray9 = @[@"Run",@"Into",@"Wen",@"Love"]*  方法执行后:mArray9 = @[@“Run",@"Into",@"Love",@"Wen"]*/[mArray9 exchangeObjectAtIndex:2 withObjectAtIndex:3];return 0;
}

               



 

  /*****

  ***数组的遍历 (我所了解的目前有三种方式)

     ****/

  1、枚举器法  (这种方法在遍历过程中不能改变数组的个数以及元素的位置,不然会出错)

      NSEnumerator * enumerator = [mutableArray objectEnumerator];//构造枚举器

      id obj;

      while (obj = [enumerator nextObject]) {

          //obj既为元素

      }

 

  2、快速枚举法  (有的叫做 快速for循环) (这种方法依旧在遍历过程中不能改变数组的个数以及元素的位置,不然会出错)

      for(id obj in mutableArray){

          //obj既为元素

      } //这种方法他们都说是最快的,我也就当作最快的来用

 

   对于枚举器,还有一种叫做逆序枚举器,方法如下  

    NSEnumerator *enumrator = [mutableArray reverseObjectEnumerator];//构造逆序枚举器,用法同枚举器一样,但不一样的是,用逆序枚举器遍历的时 候,以上两种方法可以改变数组的个数以及元素的位置。

 

  3、使用for循环进行遍历 (这种遍历方法可以在循环中改变数组的个数以及元素的位置)

      for (int i = 0; i < [mutableArray count]; i++) {

          id obj = [mutableArray objectAtIndex:i];// obj既为元素

      }