一. NSArray(不可变数组)
1. 简介
OC数组只能储存OC对象,不能存储C语言基本数据类型,要存储C语言基本数据类型要通过NSNumber类包装成对象,要存储结构体要通过NSValue包装成对象,才可进行存储
2. 数组以nil结尾,代表结束,相当于C语言字符串的’\0’
3. 数组的创建与初始化
//创建一个空的不可变数组,该数组不能添加对象,大小为0
NSArray *array0 = [[NSArray alloc] init];
NSLog(@"array0---%@",array0);
//快速初始化一个空的不可变数组,该数组不能添加对象,大小为0
NSArray *array00 = [NSArray array];
NSLog(@"array00---%@",array00);
//在C数组中存储对象,通过C数组初始OC数组;
NSString *str[2]={@"aa",@"bb"};
//注意:count必须是小于或等于C数组元素个数
NSArray *array1 = [[NSArray alloc] initWithObjects:str count:2];
NSLog(@"array1---%@",array1);
//通过C数组创建OC数组
NSArray *array11 = [NSArray arrayWithObjects:str count:2];
NSLog(@"array11---%@",array11);
//直接给数组赋值
NSArray *array2 = [[NSArray alloc] initWithObjects:@"cc",@"dd",@88, nil];
NSLog(@"array2---%@",array2);
NSArray *array22 = [NSArray arrayWithObjects:@"cc",@"dd",@88, nil];
NSLog(@"array22---%@",array22);
//简单初始化
NSArray *array3 = @[@"ee",@"ff"];
NSLog(@"array3---%@",array3);
//创建一个只有一个元素的数组
NSArray *array33 = [NSArray arrayWithObject:@"hello world !"];
NSLog(@"array33---%@",array33);
//通过数组初始化
NSArray *array4 = [[NSArray alloc] initWithArray:array3];
NSLog(@"array4---%@",array4);
NSArray *array44 = [NSArray arrayWithArray:array3];
NSLog(@"array44---%@",array44);
4. 读取元素
//1.简单取值
NSLog(@"%@",array[1]);
//2.索引取值
NSLog(@"%@",[array objectAtIndex:0]);
NSLog(@"%@", [array objectAtIndexedSubscript:1] );
//3.取第一个元素
NSLog(@"取第一个元素 %@",[array firstObject]);
//4.取最后一个元素
NSLog(@"取最后一个元素 %@",[array lastObject]);
5. 数组的遍历
//常规遍历
for (int i = 0; i < array.count; i++) {
NSLog(@"array[%i] = %@",i,array[i]);
}
//for-in遍历
for (NSNumber *number in array) {
NSLog(@"for - in %@",number);
}
//枚举器遍历
//stop:表示停止
//idx:表示遍历到的元素下标
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@" this %ld : %@",idx,obj);
}];
6. 数组排序
Person *per = [Person new];
Person *per1 = [Person new];
Person *per2 = [Person new];
per.age =12;
per1.age = 26;
per2.age = 18;
NSArray *array = @[per,per1,per2];
//该方法只能执行一个无参的方法,并且数组里面的对象都执行一次
//[array makeObjectsPerformSelector:@selector(go)];
//该方法能传递有一个参数的的方法,参数必须是对象,并且数组里面的对象都执行一次
[array makeObjectsPerformSelector:@selector(run:) withObject:nil];
NSArray *array1 = @[@12,@23,@1,@3,@(-4),@8,@0,@(-1),@(-6)];
NSLog(@"%@",array1);
//注意: 想使用compare方法对数组中的元素进行排序,
//那么数组中的元素必须是Foundation框架中的对象, 也就是说不能是自定义对象
NSArray *array11 = [array1 sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",array11);
//对自定义对象排序
NSArray *array2 = [array sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 age] < [obj2 age];
}];
NSLog(@"%@",array2);
7. 数组与字符串的转换
NSArray *array = @[@1,@2,@3,@4];
//数组转字符串
NSString *str = [array componentsJoinedByString:@"-"];
NSString *str1 = [array componentsJoinedByString:@""];
NSLog(@"%@ %@",str,str1);
//字符串转数组
NSArray *array1 = [str componentsSeparatedByString:@"-"];
NSLog(@"%@",array1);
NSArray *array2 = [str1 componentsSeparatedByString:@""];
NSLog(@"%@",array2);
8. 数组对文件的读写
//通过文件路径读取文件
NSString *path = @"/Users/MAC_SJM/Desktop/new.plist";
//注意:读取的文件必须是plist文件,否则可能出错
NSArray *array5 = [[NSArray alloc] initWithContentsOfFile:path];
NSLog(@"array5---%@",array5);
NSArray *array55 = [NSArray arrayWithContentsOfFile:path];
NSLog(@"array55---%@",array55);
//通过URL读取文件
NSURL *url = [NSURL fileURLWithPath:path];
NSArray *array6 = [[NSArray alloc] initWithContentsOfURL:url];
NSLog(@"array6---%@",array6);
NSArray *array66 = [NSArray arrayWithContentsOfURL:url];
NSLog(@"array66---%@",array66);
//通过路径写入文件
NSArray *array1 = @[@1,@2,@3,@4];
NSString *path = @"/Users/MAC_SJM/Desktop/new.plist";
BOOL flag1 = [array1 writeToFile: path atomically:YES];
if (flag1) {
NSLog(@"写入成功");
} else {
NSLog(@"写入失败");
}
//通过URL写入文件
NSURL *url = [NSURL fileURLWithPath:path];
BOOL flag2 = [array1 writeToURL:url atomically:YES];
if (flag2) {
NSLog(@"写入成功");
} else {
NSLog(@"写入失败");
}
二. NSMutableArray(可变数组)
1. NSMutableArray是NSArray的子类,继承了NSArray大部分的方法
2. NSMutableArray特有方法
//数组初始化
//不要把一个不可变数组赋值给一个可变数组变量
NSMutableArray *arr = @[@"a",@90];
//创建一个空的可变数组
NSMutableArray *arrM = [NSMutableArray array];
//给可变数组添加元素
[arrM addObject:@"000"];
NSLog(@"%@",arrM);
//用一个数组的元素存到另一个数组中
//注意:这里并不是把一个数组当做对象存入数组
[arrM addObjectsFromArray:@[@"111",@"666"]];
NSLog(@"%@",arrM);
//插入元素
[arrM insertObject:@"D" atIndex:2];
NSLog(@"%@",arrM);
//NSRange变量的指定插入区间要符合规定
// 0<=location<=被插入数组现有的个数,且length的值必须等于要插入的元素个数
NSRange range = NSMakeRange(4, 3);
NSIndexSet *indeSet = [NSIndexSet indexSetWithIndexesInRange:range];
[arrM insertObjects:@[@"E",@"F",@"G"] atIndexes:indeSet];
NSLog(@"%@",arrM);
//删除元素
//删除指定元素
[arrM removeObject:@"A"];
NSLog(@"%@",arrM);
//删除最后一个元素
[arrM removeLastObject];
NSLog(@"%@",arrM);
//删除指定下标的元素
[arrM removeObjectAtIndex:2];
NSLog(@"%@",arrM);
//删除指定区间内的指定的元素
[arrM removeObject:@"D" inRange:NSMakeRange(0, 2)];
NSLog(@"%@",arrM);
//删除指定区间内的元素
[arrM removeObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]];
NSLog(@"%@",arrM);
//修改元素
[arrM replaceObjectAtIndex:0 withObject:@"A"];
NSLog(@"%@",arrM);
arrM[0] = @"Hello World!";
NSLog(@"%@",arrM);