Objective-C学习-数组 NSArray 和 NSMutableArray

2016-12-14 09:53:39来源:http://blog.csdn.net/RunIntoLove/article/details/47277163作者:RunIntoLove人点击

在学习 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
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 和 array5
NSArray * array4 =[[NSArray alloc]initWithArray:array1];
NSArray * array5 = [NSArray arrayWithArray:array1];
//通过方法来初始化数组里面的数据,注意后面不要丢了nil
NSArray * 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
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 来创建 数组对象 mArray4
NSMutableArray * mArray4 = [[NSMutableArray alloc]initWithArray:mArray1];
NSMutableArray * mArray5 = [NSMutableArray arrayWithArray:mArray1];
//初始化数组的时候 默认的元素个数是3个 但是对于可变数组无所谓,因为后面是可以加的
NSMutableArray * mArray6 = [[NSMutableArray alloc]initWithCapacity:3];
NSMutableArray * mArray7 = [NSMutableArray arrayWithCapacity:3];
//通过事先放入几个元素对象 来完成初始化,但是一定不要忘记后面的nil
NSMutableArray * 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既为元素


  }


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台