Objective-C学习-数组 NSArray 和 NSMutableArray

本文深入探讨了Objective-C中的数组应用,重点讲解了不可变数组(NSArray)和可变数组(NSMutableArray)的区别与使用方法,包括数组的初始化、基本操作和遍历策略。同时,介绍了数组遍历的不同方式及其注意事项。
摘要由CSDN通过智能技术生成
在学习 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 和 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 <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 来创建 数组对象 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既为元素

      }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值