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
文章发布时间为: September 1st , 2016 at 04:52 pm
最后编辑时间为: August 27th , 2017 at 09:48 am
本文由 99ios 创作,转载请注明出处
最后编辑时间为: August 27th , 2017 at 09:48 am
本文由 99ios 创作,转载请注明出处