Foundation框架-02 NSArray
1.NSArray基本概念
- NSArray是OC中的数组类
- 只能存储OC对象,并且是有序数组
- 不能存储非OC对象,但是可以将非OC对象转换后存储
- NSArray是不可变数组,一旦初始化完毕后里面的内容就永远不变,不能往里面添加元素,且不能删除里面的元素
2.NSArray的初始化
//单个元素数组的创建
NSArray *arr = [NSArray arrayWithObject:@"obj1"];
//多个元素的数组的创建,注意数组中的nil是结束符
NSArray *arr = [NSArray arrayWithObjects:@"obj1",@"obj2",@"obj3",nil];
//NSArray可以存储不同的OC对象
NSArray *arr = [NSArray arrayWithObjects:[Person new],[NSObject new],@"obj3",nil];
- 获取数组的长度: [arr count];
- 获取数组的元素
- 获取最后一个元素:[arr lastObject];
- 获取第一个元素:[arr firstObject];
- 获取指定位置的元素:[arr objectAtIndex:1];
判断数组中是否包含某个元素:[arr containsObhect:objc];
快速创建数组:NSArray *arr = @[@”obj1”,@”obj2”,@”obj3”];
- 快速获取数组元素: arr[index];
3.NSArray遍历
- 建议开发中使用方法三遍历数组
//常规遍历
for(int i = 0;i < arr.count;i++){
NSLog("arr[%i] = %@",i,arr[i]);
}
//利用增强For循环,obj的类型可以根据数组中的元素的类型来写
for(NSObject *obj in arr){
NSLog(@"obj = %@",obj);
}
//使用OC数组的迭代器来遍历,没取出一个元素就会调用一次block,每次调用block都会将当前取出的元素和元素对应的索引传递给我们,objc就是当前数组的元素,idx就是当前元素的索引,stop参数用来停止遍历
[arr enumerateObjectUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){
NSLog(@"obj = %@,idx = %lu",obj,idx);
}]
- 如果使用OC数组存储对象,可以调用OC数组的方法让数组中所有的元素都执行指定的方法
- 注意:使用该方法时需要数组中所有的对象都能执行指定的方法
[arr makeObjectsPerformSelector:SEL];
//给指定的方法传一个参数
[arr makeObjectsPerformSelector:SEL withObject:id object];
4.数组排序
//compare:方法只能针对Foundation框架中的OC类进行排序,而不能堆自定义对象排序
NSArray *arr = @[@"10",@"50",@"20",@"30"];
NSArray *newArr = [arr sortedArrayUsingSelector@selector(compare:)];
// 自定义对象排序
NSArray *arr = @[p1,p2,p3,p4];
NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// 每次调用该block都会取出数组中的两个元素给我们
return obj1.age > obj2.age;//降序排列
// return obj1.age < obj2.age;//升序排列
5.NSArray和NSString的转换
- 数组转换为字符串
//将数组中的元素用aString分隔拼接起来
NSString *str = [arr componentsJoinedByString:(NSString *)aString];
- 字符串转换为数组
// 将字符串以aString字符分隔后添加到数组
NSArray *arr = [str componentsSeparatedByString:NSString *)aString];
6.NSArray文件读写
- 将数组写入到文件中
- BOOL flag = [arr writeToFile:@”/Users/xxx/Desktop/abc.plist” atomically:YES];
- 如果将一个数组写入到文件中,本质是写入了一个XML文件,在IOS开发中一般情况下我们会讲XML文件的扩展名保存为plist
- 注意:writeToFile只能写入数组中保存的元素都是Foundation框架中的类的时候,不能写入自已定类
- 从文件中读取一个数组
- NSArray *newArray = [NSArray arrayWithContentsOfFile:@”/Users/xxx/Desktop/abc.plist”];
7.NSMutableArray
- NSMutableArray是NSArray的子类,是可变数组,和NSMutableString类似,可以动态的改变数组中的内容
- 增:
- [arrM addObject:id object];
- [arrM addObjectsFromArray:(NSArray *)array];//将指定数组中的元素都取出来,放到arrM中,并不是将整个数组作为一个元素添加到arrM中
- 插:
- [arrM insertObject:@”test1” atIndex:1];
- [arrM insertObjects:@[@”test2”,@”test3”]] atIndexes:[NSIndexSet indexSetWuthIndexsInRange:NSMakeRange(2,2)];//插入一组数据,指定需要插入的位置和插入的数量
- 删:
- [arrM removeObjectAtIndex:0];
- [arrM removeLastObject];
- [arrM removeObject:@”test1”];
- 改:[arrM replaceObjectAtIndex:1 withObject:@”test1”];//arrM[1] = @”test1”;
查:[arrM objectAtIndex:0];//arrM[index];
注意:不能通过快速创建数组的方式创建可变数组,因为@[]创建出来的是一个不可变的数组,如果把一个不可变数组当作可变数组来使用,会引发一个运行时的错误