Foundaton框架-->NSArray数组

一、NSArray基本概念

  • 什么是NSArray?

    • NSArray是OC中的数组类
  • NSArray的使用注意

    • 只能存放任意OC对象,并且是有顺序的
    • 不能存储非OC对象,比如int\float\double\char\enum\struct
    • 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素,也不能再往里面添加元素

二、如何创建OC数组

  • 方法一:arrayWithObjects,数组中的nil是结束符
  • 方法二:数组简写
    NSArray *arr = [NSArray arrayWithObjects:@"lnj", @"lmj", @"jjj"];
    NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
    // 获取数组元素的简写
    NSLog(@"%@", [arr objectAtIndex:0]);
    NSLog(@"%@", arr[0]);

三、OC数组方法

  • 计算个数
    • [arr count]
  • 数组最后一个内容
    • [arr lastObject]
  • 数组第一个内容
    • [arr firstObject]
  • 数组第几个的内容
    • [arr objectAtIndex:1]
  • 数组是否包含该内容
    • [arr containsObject: @"zs"]

四、NSArray遍历

  • 1.常规遍历
for (int i = 0; i < arr.count; ++i) {
        NSLog(@"arr  = %@,count = %i", arr[i],(int )i);
    }
  • 2.如果是OC数组可以使用OC中的增强for循环来遍历
    • 逐个取出arr中的元素, 将取出的元素赋值给obj
    • 注意: obj的类型可以根据数组中元素的类型来写, 不一定要写NSObject
for (NSString *obj in arr) {
        NSLog(@"obj = %@", obj);
    }
  • 3.使用OC数组的迭代器来遍历[开发建议使用]
    • enumerateObjectsUsingBlock
    • 每取出一个元素就会调用一次block
    • 每次调用block都会将当前取出的元素和元素对应的索引传递给我们
    • obj就是当前取出的元素, idx就是当前元素对应的索引
    • stop用于控制什么时候停止遍历
  [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"obj = %@, idx = %lu", obj,idx);
    }];

五、给NSArray中的所有对象方法消息

  • 如果使用OC数组存储对象,可以调用OC数组的方法让数组中所有的元素都执行指定的方法

  • makeObjectsPerformSelector

  • makeObjectsPerformSelector: withObject:

  • 注意:

    • 如果数组中保存的不是相同类型的数据, 并且没有相同的方法, 那么会报错
    • withObject: 需要传递给调用方法的参数
[arr makeObjectsPerformSelector:@selector(say)];
[arr makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"lnj"];

六、数组排序

  • sortedArrayUsingSelector: @selector(compare: )
    • compare方法对数组中的元素进行排序,数组中的元素必须是Foundation框架中的对象, 不能是自定义对象
    NSArray *arr = @[@(1),@(54),@(2),@(34),@(66),@(21),@(660),@(3),@(23),@(566)];
    NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@", newArr);
  • NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2)
    • 该方法默认会按照升序排序
    • 该排序方法是二分法
    • return obj1.age > obj2.age;升序
    • return obj1.age < obj2.age;降序
    NSArray *arr = @[@(1),@(54),@(2),@(34),@(66),@(21),@(660),@(3),@(23),@(566)];
//    NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
    NSArray *newArr =[arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
       return obj1 < obj2;
    }];
    NSLog(@"%@", newArr);

七、NSArray和NSString转换

  • componentsJoinedByString
    • 用-将所有的姓名连接起来生成一个字符串
    NSArray *arr = @[@"lm1",@"lm2",@"lm3",@"lm4", ];
    NSString *str = [arr componentsJoinedByString:@"-love-"];
    NSLog(@"%@", str);
//打印为: lm1-love-lm2-love-lm3-love-lm4
  • 通过一个字符串生成一个数组`
    • componentsSeparatedByString、
    • 以**为分隔符变为数组
    NSArray *arr = @[@"lm1",@"lm2",@"lm3",@"lm4", ];
    NSString *str = [arr componentsJoinedByString:@"-love-"];
    NSLog(@"%@", str);
    NSArray * newArr = [str componentsSeparatedByString:@"love"];
    NSLog(@"newArr:%@", newArr);

八、NSArray文件读写

  • 1.将数组写入到文件中
    • writeToFile
    • 在iOS开发中一般情况下我们会将XML文件的扩展名保存为plist
  • 2.从文件中读取一个数组
    • arrayWithContentsOfFile
    • 注意:writeToFile只能写入数组中保存的元素都是Foundation框架中的类创建的对象,如果保存的是自定义对象那么不能写入

NSMutableArray

一、NSMutableArray的介绍

  • 什么是NSMutableArray
    • NSMutableArray是NSArray的子类
    • NSMutableArray是可变的,NSArray是不可变的

二、NSMutableArray的基本用法

  • 1.创建一个空的数组
NSMutableArray *arrM = [NSMutableArray array];
  • 2.如何添加
[arrM addObject:@"lnj"];
[arrM addObjectsFromArray:@[@"lmj", @"jjj"]];
  • 3.如何插入
[arrM insertObject:@"xcq" atIndex:1];
  • 4.如何删除
[arrM removeObjectAtIndex:0];
     NSLog(@"%@", arrM);

    [arrM removeLastObject];
    NSLog(@"%@", arrM);

    [arrM removeObject:@"A"];
     NSLog(@"%@", arrM);
  • 5.如何替换
[arrM replaceObjectAtIndex:1 withObject:@"M"];
    NSLog(@"%@", arrM);
  • 6.如何获取
[arrM objectAtIndex:3];
    NSLog(@"%@",arrM[3]);
  • 7.注意
  • 不能通过@[]来创建一个可变数组, 因为@[]创建出来的是一个不可变的数组
  • 如果把一个不可变数组当做一个可变数组来使用, 会引发一个运行时的错误
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容