ios NSArray / NSMutableArray

NSArray

放任何OC类的对象,不允许放基本数据类型,数组里面是id指针,id指针只能指向OC类的对象


1. 创建方法:(5)
NSArray *a = [NSArray array]; //调用工厂方法来初始化,空数组,没有任何意义
NSArray *a1 = [NSArray arrayWithObject:@"one"]; //只有一个元素的数组,意义不大,可以用一个对象就可以
NSArray *a2 = [NSArray arrayWithObjects:@"one", @"tow",@"three",nil]; //可以有多个元素,nil不可以丢,标志数组元素结束,就如/0一样
NSArray *a3 = @[@"one",@"tow",@"three"]; //优化后的方法,最常用
NSArray *a4 = [NSArray arrayWithArray:a3]; //生成副本
2. 数组的属性:
array.count  //求数组元素个数 
3. 根据下标取数组值:(单个)
NSString *str = [a4 objectAtIndex:2];//求数组指定下标对应的元素值   优化后可以用C中数组表示NSLog(@"%@", a4[2]);(越界就会导致程序崩溃)
str = [a4 lastObject];  =》 str = a4 [ a4. count -1 ] ;  //取最后一个元素
str = [a4 firstObject]; =》 str = [a4 objectAtIndex:0]; //取第一个元素

4. 根据元素值求下标:
NSUInteger index = [a4 indexOfObject:@"three"];  //越界后就是一个无比大的值
防止越界:
if (index >= a4[a4.count - 1]) {
     NSLog(@“元素不存在”);
}else{
      NSLog(@"%lu", index);
 }
5. 数组的遍历:(显示,满足条件输出。。。。)
NSLog(@"%@",array6);  //直接输出

//面向过程(?还是对象)的循环,只用于遍历
for (NSString *s in array6) {
     NSLog(@"%@", s);
}

//满足条件输出
NSArray *array6 = @[@"one",@"tow",@"three",@"one"];
    for (NSString *str in array6) {
        if ([str isEqualTo:@"one"] == YES) {
            NSLog(@"%@", str);
         }
    }
6. 数组排序三部曲:
1. 创建数组:
    NSArray *array = @[i1, i2, i3, i4, i5];
2. 写一个方法:实例方法
  //格式,排序规则(声明并实现)
  -(NSComparisonResult) compareInterger:(TRInterger *)other{    //枚举:NSComparisonResult,里面有3个参数
    if ( self.interger > other.interger ) {
        return NSOrderedAscending;  //升序
    }
    else if (  self.interger <  other.interger ){
        return NSOrderedDescending;  //降序
    }
    else{
        return NSOrderedSame;  //相等
    }
}
3. 调用: //升序与降序完全取决于规则
  NSArray *sorted = [array sortedArrayUsingSelector:@selector(compareInterger:)];


拼音排序:
(补充)
-(NSComparisonResult)compareName:(TRStudent *)other{
    return [self.pinYin compare:other.pinYin]; // compare:调用方法
    }
//转为拼音
        NSMutableString *str = [NSMutableString stringWithString:@"计算机语言"];
        if (CFStringTransform((__bridge CFMutableStringRef)str, 0, kCFStringTransformMandarinLatin, NO))
        {
            NSLog(@"%@", str);
        }
        if (CFStringTransform((__bridge CFMutableStringRef)str, 0, kCFStringTransformStripDiacritics, NO))
        {
            NSLog(@"%@", str);
        }
副本当中的数组元素,深浅拷贝生成方法:采纳协议<NScoping>
NSArray *copid = [[NSArray alloc] initWithArray:stu copyItems:NO]; //NO表示是引用计数拷贝 //YES表示深拷贝

NSMutableArray:

可变数组,是NSArray的子类

1. 创建:(堆上)
NSMutableArray *array1 =[NSMutableArray array];
NSMutableArray *array2 = [NSMutableArray arrayWithCapacity:100]; //预估值
NSMutableArray *array3 = @[@"one", @"tow"]; //退化为NSArray
NSMutableArray *array4 = [NSMutableArray arrayWithObjects: @"one", @"tow", @"three",nil]; //最常用,不可少nil
2.添加(元素)方法 :
[array4 addObject:@"six"]; //末尾添加
[array4 insertObject:@"fine" atIndex:2]; //指定下标处添加
3. 修改(元素)方法:
[array4 replaceObjectAtIndex:0 withObject:@"NO"]; //指定下标修改
批量修改:
 NSArray *replace = @[@"five", @"six", @"seven"];
 [array4 replaceObjectsInRange:NSMakeRange(1, 2) withObjectsFromArray:replace];

4. 删除:
[array4 removeLastObject]; //删除最后一个元素
[array4 removeObjectAtIndex:0]; //删除下标元素
[array4 removeObject:@"six"]; //删除元素
[array4 removeObjectsInRange:NSMakeRange(0, 2)]; //指定范围删除
NSArray *del = @[@"five", @"three"];
[array4 removeObjectsInArray:del]; //删除不连续元素
[array4 removeAllObjects]; //清空数组

注意:

//不能一次遍历
for (NSArray *college in school) {
     for ( NSArray *class in college) {
         for (TRStudent *stu in class) {
            //if(stu.age >=20)
            NSLog(@"%@", stu);
          }
      }
}

//数组遍历过程中 删除元素 会有元素遍历不到(丢元素)
    NSMutableArray *mArray = [@[@1,@2,@3,@4,@5,@6,@7,@8,@9,@10] mutableCopy];
    for (NSInteger i = 0; i < mArray.count; i++) {
        static int index = 0;
        NSLog(@"------ %d",++index);
        [mArray removeObjectAtIndex:i];
    }
    NSLog(@"mArray = %@",mArray);

成功的三大原则: 1、坚持 2、不要脸 3、坚持不要脸
原文地址:https://www.cnblogs.com/xulinmei/p/7420085.html