免费开源的iOS开发学习平台

OC数组:1-NSArray类

数组是有序的对象集合,一般情况下,一个数组中的元素都是同一类型的对象。Objective-C的数组和许多其他的编程语言都不太一样,Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同类型的对象。但是缺点是只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成Objective-C对象后才能加入数组。

在Foundation框架中,提供了NSArray类来管理与数组相关的操作。NSArray类的数组是不可变数组,这种不可变包括:数组中不能新增元素,并且数组内已经存在的对象也不支持修改。如果希望对数组进行修改,那么在声明时需要把数组声明为NSMutableArray(可变数组),NSMutableArray类是NSArray类的子类。

创建数组

在Foundation框架中,我们可以采用如下几种方式来创建数组。

  • 使用@[]。这种方式是创建数组最经常使用的方式之一,只需要把数组中需要保存的对象放在中括号中间即可。
    NSArray *array1 = @[@123,@456,@789];
    NSArray *array2 = @[@123,@456,@"789"];
    NSArray *array3 = @[@"tom",@"jerry",@"jobs"];

注意:我们可以看到在创建array2时,数组中保存的数据对象类型可以不同,这个是Objective-C的特点之一。

  • 使用arrayWithObjects方法。类方法。这种方式创建数组,数组的结尾需要添加一个空对象nil来标识数组的结尾。
NSArray *array = [NSArray arrayWithObjects:@"123",@"456",@"789", nil];
  • 使用initWithObjects方法,这是一个实例方法,我们需要提前执行alloc操作。
NSArray *array = [[NSArray alloc] initWithObjects:@"tom",@"jerry",@"jobs", nil];

数组的复制

当直接把一个数组对象赋值给另外一个数组对象时,此时进行的是指针复制,即在内存中,数组中的对象只保留了一个版本。另外,在NSArray类中,提供了arrayWithArray方法,这个方法对原数组进行了完整的复制,从而得到了一个全新的数组。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //数组的创建
        NSArray *array = @[@123,@456,@789];
        //数组的复制属于指针拷贝
        NSArray *copyArray1 = array;
        //调用arrayWithArray方法对数组的复制属于深拷贝
        NSArray *copyArray2 = [NSArray arrayWithArray:array];
        NSLog(@"原始数组地址:%p,指针复制数组地址:%p,深拷贝数组地址:%p",array,copyArray1,copyArray2);
    }
    return 0;
}   

运行结果:

数组元素操作

在实际开发过程中,当需要访问数组中的对象时,可以通过如下几种方式。

  • 通过下标来访问。数组中的元素是有序存储的,所以可以通过下标来访问。使用下标访问,既可以调用objectAtIndex方法,也可以直接使用数组名称[序号]来访问,具体方式见下方代码;
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //数组的创建
        NSArray *array = @[@123,@456,@789];
        //根据下标访问数组中的元组
        NSNumber *num = array[0];
        NSLog(@"num: %@",num);
        id obj = [array objectAtIndex:0];
        NSLog(@"obj:%@",obj);
    }
    return 0;
}

运行结果:

  • 获取某个对象对应的下标。可以通过indexOfObject方法来获取某个对象在数组中的下标,需要注意的是数组中的第一个元素的下标为0
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //数组的创建
        NSArray *array = @[@123,@456,@789];
        //查找某个对象的下标
        NSUInteger index = [array indexOfObject:@456];
        NSLog(@"对象对应数组中的下标为:%lu",(unsigned long)index);
    }
    return 0;
}

运行结果:

  • 查找数组中的对象。有时,我们希望查找某个对象是否存在在某个数组中,可以使用containsObject方法来判断。
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //数组的创建
        NSArray *array = @[@123,@456,@789];
        //查找数组中是否包含指定对象
        if ([array containsObject:@123]) {
            NSLog(@"数组中包含这个对象!");
        };
    }
    return 0;
}

运行结果:

其他常用操作

对于不可变数组NSArray来说,除了上面介绍数组对象创建、元素访问方法之外,还有如下几个在NSArray类中提供的属性和方法也相对常用。

  • count:返回数组中元素的个数
@property (readonly) NSUInteger count;
  • firstObject:获取数组中的第一个对象
@property (nullable, nonatomic, readonly) ObjectType firstObject;
  • lastObject:获取数组中的最后一个对象
@property (nullable, nonatomic, readonly) ObjectType lastObject;

示例代码

https://github.com/99ios/4.3.1