天天看点

Foundation => Objective-C - NSArray & NSMutableArray

1. NSArray

  1. 数组的创建
    简写形式

    NSArray *array = @[@"111", @"222"];

    创建空数组[NSArray array] \

    [[NSArray alloc]init]

    输出的特征 - - - 以( 数组内容 )形式展示 特性:OC数组, 可以存不同的数据类型
  2. 常用方法介绍
    获得下标为?的内容 [arr objectAtIndex: ?] 简写形式 - - - arr[?] 判断是否包含某个元素

    [arrcontainsObjects:@"111"]

    返回BOOL值
  3. 数组遍历
    常规遍历, 就是

    int i = 0

    这种

    增强for循环遍历

    for in for(NSObject *obj in array)

    逐个取出array中的元素,

    将取出的元素赋值给obj 注意: obj的类型可以根据数组中的元素类型来写, 不一定要写NSObject, 通常是数组元素是什么类型,

    就定义什么类型

    OC数组迭代器遍历 - - - 推荐这种方法

    [array enumerateObjectsUsingBlock:^(id obj,NSUinteger idx, BOOL *stop)];

    每取出一个元素, 就会调用疑似Block

    每次调用Block都会将当前取出的元素和元素对应的索引传递给我们 obj就是当前取出的元素 idx就是当前元素对应的索引

    stop用于控制什么时候停止遍历

  4. 数组排序
    1. 用compare方法对数组进行排序. 数组的元素必须是Foundation框架的对象. 不能用自定义对象
      1. num1 compare num2 -> 升序 ( 从小到大 )
      2. num2 compare num1 -> 降序 ( 从大到小 )
    2. 用下面的方法, 可以对自定义对象排序

      [sortedArrayWithOption: NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2){ //your code}];]

      NSArray *arr_NSNumber = @[@[],@[],@[],@[],@[],@[]];
      
      arr_NSNumber = [arr_NSNumber sortedArrayUsingComparator^NSComparisonResult(NSNumber *num1, NSNumber *num2){
          return [num1 compare: num2];
      } ];
      
      ------------------------------
      NSArray *arr_NSString = @[@"henry",@"peter",@"young",@"anny",@"wendy"];
      
      arr_NSString = [arr_NSString sortedArrayUsingComparator^NSComparisonResult(NSString *str1, NSString *str2){
          return [str2 compare: str1];
      } ];
      
      ------------------------------
          NSArray *arr_NSDate = @[@"2010-1-20",@"2012-12-12",@"2014-9-9",@"2015-8-23",@"2016-5-24"];
      
      arr_NSDate = [arr_NSDate sortedArrayUsingComparator^NSComparisonResult(NSDate *date1, NSDate *date2){
          return [date2 compare: date1];
      } ];    
                 
    3. 数组排序器 NSSortDescriptor
      1. http://www.cnblogs.com/Walking-Jin/p/5468371.html   使用排序器的示例博客
      
        2. ascending  是排序方式.   bool类型.   YES是升序,   NO 是降序
      
        3. 使用流程
            1. 获得要排序的数组
            2. 创建一个或多个排序器, 并初始化,指定排序属性,升序降序
            3. 让数组根据排序条件进行排序.  得到一个排序后的新数组
                 
  5. 让NSArray中所有对象执行方法

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

    如果数组中保存的不是相同类型的数据, 并且没有相同的方法, 就会报错 [array

    makeObjectsPerformSelector:@selector(方法名)];

    这个方法可以带且仅能带一个参数, 需要多个参数,

    就需要用遍历来做 withObject: 需要传递给调用方法的参数

    [array makeObjectsPerformSelector:@selector(方法名) withObject: @"参数"];

  6. 数组排列
    注意: 使用 compare 方法对数组元素进行排序. 数组元素必须是 Foundation 框架中的对象, 不能是自定义对象

    NSArray *newArr = [array sortedArrayUsingSelector:@selector(方法名)];

    newArr是排序后的新数组, 因为array是不可变的数组 自定义对象的排序, 需要明确指出排序的规则

    [array sortedArrayWithOptions: NSSortStable usingComparator: ^NSComparisonResult(id obj1, id obj2){ 内容 }];

    该方法默认按升序排序 每次调用 block,都会取出数组中的2个元素 这个 block 需要返回值. 可以 return obj1.属性名 > obj2.属性名
  7. NSArray和NSString转换
    通过数组生成字符串

    NSString * str = [array componentsJoinedByString:@“-”];

    通过字符串, 生成数组,也叫字符串切割

    NSArray * array =[str componentsSeparatedByString:@“-”];

  8. NSArray文件读写
    文件写入

    BOOL 变量名 = [array writeToFile:@"路径字符串"atomically: YES];

    文件读取

    NSArray *newArr = [NSArray arrayWithContentsOfFile:@"路径字符串"];

    写入自定义的对象 - - - writeToFile只能写入Foundation框架的对象类型, 自定义的不能写入
  9. 引用
    1. OC数组不能存放nil值
    2. OC数组只能存放OC对象, 不能存放非OC对象类型. 比如int, struct, enum等
    3. NSArray和NSMutableArray分别是 不可变数组/可变数组
    4. NSArray的创建

      NSArray *array1 = [NSArray arrayWithObject :@”jack”];

      NSArray *array2 = [NSArray arrayWithObjects:@“jack”,@“rose”,nil]; //nil是数组元素结束的标记

      NSArray *array3 = @[@“jack”,@“rose”,@“191919”]; //快速创建一个NSArray对象

    5. NSArray的元素个数

      NSLog(@“%ld”, array3.count);

    6. NSArray中元素的访问

      NSLog(@“%@“, [array3 objectAtIndex:1]);

      NSLog(@“%@“,array3[0]);

    7. 遍历数组
      //每遍历到一个元素, 就会调用一次block , 并且当前元素和索引位置当做参数传给block
               [ array enumrateObjectsUsingBlock:  ^(id obj, NSUInteger idx, BOOL *stop)
               {
                   NSLog(@“%ld - %@”, idx, obj );
                   if (idx == )
                   {
                       *stop = YES;  //停止遍历
                   }
               }] ;
                 
    8. 如何计算代码行数(也可以是计算一个文档里, 包含的特定字符串的数量) —黑马Foundation—09,综合练习1
    9. 递归的例子—10.综合练习2->计算整个文件夹的代码行数

2. NSMutableArray

  1. 如何添加元素

    [arM addObject:@“111”]; ===> 添加一个元素 [arrM addObjectsFromArray:

    @[@“QQ”,@“DING”]]; ====> 将数组中所有元素取出, 加入到 arrM 中

  2. 如何插入元素

    //插入1个元素 [arrM insertObject:@“ZZZ” atIndex: 10];

    //插入一组数据,

    指定数组需要插入的位置, 和插入多少个

    [arrM insertObjects:@[@“AAA”,@“BBB”] atIndexs:(NSIndexSet *)];

  3. 如何删除元素
    [arrM removeObjectAtIndex: 0]; 
    [arrM removeObject: @“AAA”]; [arrM
    removeLastObject];
               
  4. 如何替换元素
    [arrM replaceObjectAtIndex: 10 withObject:@“MMM”];
    arrM[10] = @“MMM”;  ==>简写
               
  5. 如何获得
    [arrM objectAtIndex:];
    arrM[] ===> 简写
    
    注意: 不能通过@[] 创建可变数组. 因为它创建的时不可变数组( NSArray );
    如果把NSArray 当作 NSMutableArray 用, 会引发一个运行时错误
               

继续阅读