NSArray与NSMutableArray的应用小结

本文深入讲解了Objective-C中的NSArray和NSMutableArray的使用方法,包括数组的创建、初始化、元素的读取与修改、排序、与字符串及文件之间的转换等。同时介绍了如何对自定义对象进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. NSArray(不可变数组)

1. 简介

OC数组只能储存OC对象,不能存储C语言基本数据类型,要存储C语言基本数据类型要通过NSNumber类包装成对象,要存储结构体要通过NSValue包装成对象,才可进行存储

2. 数组以nil结尾,代表结束,相当于C语言字符串的’\0’
3. 数组的创建与初始化
    //创建一个空的不可变数组,该数组不能添加对象,大小为0
    NSArray *array0 = [[NSArray alloc] init];
    NSLog(@"array0---%@",array0);
    //快速初始化一个空的不可变数组,该数组不能添加对象,大小为0
    NSArray *array00 = [NSArray array];
    NSLog(@"array00---%@",array00);

    //在C数组中存储对象,通过C数组初始OC数组;
    NSString *str[2]={@"aa",@"bb"};
    //注意:count必须是小于或等于C数组元素个数
    NSArray *array1 = [[NSArray alloc] initWithObjects:str count:2];
    NSLog(@"array1---%@",array1);
    //通过C数组创建OC数组
    NSArray *array11 = [NSArray arrayWithObjects:str count:2];
    NSLog(@"array11---%@",array11);

    //直接给数组赋值
    NSArray *array2 = [[NSArray alloc] initWithObjects:@"cc",@"dd",@88, nil];
    NSLog(@"array2---%@",array2);
    NSArray *array22 = [NSArray arrayWithObjects:@"cc",@"dd",@88, nil];
    NSLog(@"array22---%@",array22);

    //简单初始化
    NSArray *array3 = @[@"ee",@"ff"];
    NSLog(@"array3---%@",array3);
    //创建一个只有一个元素的数组
    NSArray *array33 = [NSArray arrayWithObject:@"hello world !"];
    NSLog(@"array33---%@",array33);

    //通过数组初始化
    NSArray *array4 = [[NSArray alloc] initWithArray:array3];
    NSLog(@"array4---%@",array4);
    NSArray *array44 = [NSArray arrayWithArray:array3];
    NSLog(@"array44---%@",array44);
4. 读取元素
    //1.简单取值
    NSLog(@"%@",array[1]);

    //2.索引取值
    NSLog(@"%@",[array objectAtIndex:0]);
    NSLog(@"%@", [array objectAtIndexedSubscript:1] );

    //3.取第一个元素
    NSLog(@"取第一个元素 %@",[array firstObject]);

    //4.取最后一个元素
    NSLog(@"取最后一个元素 %@",[array lastObject]);
5. 数组的遍历
    //常规遍历
    for (int i = 0; i < array.count; i++) {
      NSLog(@"array[%i] = %@",i,array[i]);
    }

    //for-in遍历
    for (NSNumber *number in array) {
      NSLog(@"for - in  %@",number);
    }

    //枚举器遍历
    //stop:表示停止
    //idx:表示遍历到的元素下标
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
      NSLog(@" this %ld : %@",idx,obj);
    }];
6. 数组排序
    Person *per  = [Person new];
    Person *per1 = [Person new];
    Person *per2 = [Person new];
    per.age =12;
    per1.age = 26;
    per2.age = 18;

    NSArray *array = @[per,per1,per2];
    //该方法只能执行一个无参的方法,并且数组里面的对象都执行一次
    //[array makeObjectsPerformSelector:@selector(go)];
    //该方法能传递有一个参数的的方法,参数必须是对象,并且数组里面的对象都执行一次
    [array makeObjectsPerformSelector:@selector(run:) withObject:nil];

    NSArray *array1 = @[@12,@23,@1,@3,@(-4),@8,@0,@(-1),@(-6)];
    NSLog(@"%@",array1);
    //注意: 想使用compare方法对数组中的元素进行排序, 
    //那么数组中的元素必须是Foundation框架中的对象, 也就是说不能是自定义对象
    NSArray *array11 = [array1 sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@",array11);

    //对自定义对象排序
    NSArray *array2 = [array sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
      return [obj1 age] < [obj2 age];
    }];
    NSLog(@"%@",array2);
7. 数组与字符串的转换
    NSArray *array = @[@1,@2,@3,@4];
    //数组转字符串
    NSString *str = [array componentsJoinedByString:@"-"];
    NSString *str1 = [array componentsJoinedByString:@""];
    NSLog(@"%@  %@",str,str1);

    //字符串转数组
    NSArray *array1 = [str componentsSeparatedByString:@"-"];
    NSLog(@"%@",array1);
    NSArray *array2 = [str1 componentsSeparatedByString:@""];
    NSLog(@"%@",array2);    
8. 数组对文件的读写
    //通过文件路径读取文件
    NSString *path = @"/Users/MAC_SJM/Desktop/new.plist";
    //注意:读取的文件必须是plist文件,否则可能出错
    NSArray *array5 = [[NSArray alloc] initWithContentsOfFile:path];
    NSLog(@"array5---%@",array5);
    NSArray *array55 = [NSArray arrayWithContentsOfFile:path];
    NSLog(@"array55---%@",array55);

    //通过URL读取文件
    NSURL *url = [NSURL fileURLWithPath:path];
    NSArray *array6 = [[NSArray alloc] initWithContentsOfURL:url];
    NSLog(@"array6---%@",array6);
    NSArray *array66 = [NSArray arrayWithContentsOfURL:url];
    NSLog(@"array66---%@",array66);

    //通过路径写入文件
    NSArray *array1 = @[@1,@2,@3,@4];
    NSString *path = @"/Users/MAC_SJM/Desktop/new.plist";
    BOOL flag1 = [array1 writeToFile: path atomically:YES];
    if (flag1) {
      NSLog(@"写入成功");
    } else {
      NSLog(@"写入失败");
    }

    //通过URL写入文件
    NSURL *url = [NSURL fileURLWithPath:path];
    BOOL  flag2 = [array1 writeToURL:url atomically:YES];
    if (flag2) {
      NSLog(@"写入成功");
    } else {
      NSLog(@"写入失败");
    }

二. NSMutableArray(可变数组)

1. NSMutableArray是NSArray的子类,继承了NSArray大部分的方法
2. NSMutableArray特有方法
    //数组初始化
    //不要把一个不可变数组赋值给一个可变数组变量
    NSMutableArray *arr = @[@"a",@90];
    //创建一个空的可变数组
    NSMutableArray *arrM = [NSMutableArray array];
    //给可变数组添加元素
    [arrM addObject:@"000"];
    NSLog(@"%@",arrM);
    //用一个数组的元素存到另一个数组中
    //注意:这里并不是把一个数组当做对象存入数组
    [arrM addObjectsFromArray:@[@"111",@"666"]];
    NSLog(@"%@",arrM);

    //插入元素
    [arrM insertObject:@"D" atIndex:2];
    NSLog(@"%@",arrM);
    //NSRange变量的指定插入区间要符合规定
    // 0<=location<=被插入数组现有的个数,且length的值必须等于要插入的元素个数
    NSRange range = NSMakeRange(4, 3);
    NSIndexSet *indeSet = [NSIndexSet indexSetWithIndexesInRange:range];
    [arrM insertObjects:@[@"E",@"F",@"G"] atIndexes:indeSet];
    NSLog(@"%@",arrM);

    //删除元素
    //删除指定元素
    [arrM removeObject:@"A"];
    NSLog(@"%@",arrM);
    //删除最后一个元素
    [arrM removeLastObject];
    NSLog(@"%@",arrM);
    //删除指定下标的元素
    [arrM removeObjectAtIndex:2];
    NSLog(@"%@",arrM);
    //删除指定区间内的指定的元素
    [arrM removeObject:@"D" inRange:NSMakeRange(0, 2)];
    NSLog(@"%@",arrM);
    //删除指定区间内的元素
    [arrM removeObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]];
    NSLog(@"%@",arrM);

    //修改元素
    [arrM replaceObjectAtIndex:0 withObject:@"A"];
    NSLog(@"%@",arrM);
    arrM[0] = @"Hello World!";
    NSLog(@"%@",arrM);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值