一、NSArray基本概念
-
什么是NSArray?
- NSArray是OC中的数组类
-
NSArray的使用注意
- 只能存放任意OC对象,并且是有顺序的
- 不能存储非OC对象,比如int\float\double\char\enum\struct
- 它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的,不能删除里面的元素,也不能再往里面添加元素
二、如何创建OC数组
- 方法一:arrayWithObjects,数组中的nil是结束符
- 方法二:数组简写
NSArray *arr = [NSArray arrayWithObjects:@"lnj", @"lmj", @"jjj"];
NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
// 获取数组元素的简写
NSLog(@"%@", [arr objectAtIndex:0]);
NSLog(@"%@", arr[0]);
三、OC数组方法
- 计算个数
- [arr count]
- 数组最后一个内容
- [arr lastObject]
- 数组第一个内容
- [arr firstObject]
- 数组第几个的内容
- [arr objectAtIndex:1]
- 数组是否包含该内容
- [arr containsObject: @"zs"]
四、NSArray遍历
- 1.常规遍历
for (int i = 0; i < arr.count; ++i) {
NSLog(@"arr = %@,count = %i", arr[i],(int )i);
}
- 2.如果是OC数组可以使用OC中的增强for循环来遍历
- 逐个取出arr中的元素, 将取出的元素赋值给obj
- 注意: obj的类型可以根据数组中元素的类型来写, 不一定要写NSObject
for (NSString *obj in arr) {
NSLog(@"obj = %@", obj);
}
- 3.使用OC数组的迭代器来遍历[开发建议使用]
- enumerateObjectsUsingBlock
- 每取出一个元素就会调用一次block
- 每次调用block都会将当前取出的元素和元素对应的索引传递给我们
- obj就是当前取出的元素, idx就是当前元素对应的索引
- stop用于控制什么时候停止遍历
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"obj = %@, idx = %lu", obj,idx);
}];
五、给NSArray中的所有对象方法消息
如果使用OC数组存储对象,可以调用OC数组的方法让数组中所有的元素都执行指定的方法
makeObjectsPerformSelector
makeObjectsPerformSelector: withObject:
-
注意:
- 如果数组中保存的不是相同类型的数据, 并且没有相同的方法, 那么会报错
- withObject: 需要传递给调用方法的参数
[arr makeObjectsPerformSelector:@selector(say)];
[arr makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"lnj"];
六、数组排序
- sortedArrayUsingSelector: @selector(compare: )
- compare方法对数组中的元素进行排序,数组中的元素必须是Foundation框架中的对象, 不能是自定义对象
NSArray *arr = @[@(1),@(54),@(2),@(34),@(66),@(21),@(660),@(3),@(23),@(566)];
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", newArr);
- NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2)
- 该方法默认会按照升序排序
- 该排序方法是二分法
- return obj1.age > obj2.age;升序
- return obj1.age < obj2.age;降序
NSArray *arr = @[@(1),@(54),@(2),@(34),@(66),@(21),@(660),@(3),@(23),@(566)];
// NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSArray *newArr =[arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return obj1 < obj2;
}];
NSLog(@"%@", newArr);
七、NSArray和NSString转换
- componentsJoinedByString
- 用-将所有的姓名连接起来生成一个字符串
NSArray *arr = @[@"lm1",@"lm2",@"lm3",@"lm4", ];
NSString *str = [arr componentsJoinedByString:@"-love-"];
NSLog(@"%@", str);
//打印为: lm1-love-lm2-love-lm3-love-lm4
- 通过一个字符串生成一个数组`
- componentsSeparatedByString、
- 以**为分隔符变为数组
NSArray *arr = @[@"lm1",@"lm2",@"lm3",@"lm4", ];
NSString *str = [arr componentsJoinedByString:@"-love-"];
NSLog(@"%@", str);
NSArray * newArr = [str componentsSeparatedByString:@"love"];
NSLog(@"newArr:%@", newArr);
八、NSArray文件读写
- 1.将数组写入到文件中
- writeToFile
- 在iOS开发中一般情况下我们会将XML文件的扩展名保存为plist
- 2.从文件中读取一个数组
- arrayWithContentsOfFile
- 注意:writeToFile只能写入数组中保存的元素都是Foundation框架中的类创建的对象,如果保存的是自定义对象那么不能写入
NSMutableArray
一、NSMutableArray的介绍
- 什么是NSMutableArray
- NSMutableArray是NSArray的子类
- NSMutableArray是可变的,NSArray是不可变的
二、NSMutableArray的基本用法
- 1.创建一个空的数组
NSMutableArray *arrM = [NSMutableArray array];
- 2.如何添加
[arrM addObject:@"lnj"];
[arrM addObjectsFromArray:@[@"lmj", @"jjj"]];
- 3.如何插入
[arrM insertObject:@"xcq" atIndex:1];
- 4.如何删除
[arrM removeObjectAtIndex:0];
NSLog(@"%@", arrM);
[arrM removeLastObject];
NSLog(@"%@", arrM);
[arrM removeObject:@"A"];
NSLog(@"%@", arrM);
- 5.如何替换
[arrM replaceObjectAtIndex:1 withObject:@"M"];
NSLog(@"%@", arrM);
- 6.如何获取
[arrM objectAtIndex:3];
NSLog(@"%@",arrM[3]);
- 7.注意
- 不能通过@[]来创建一个可变数组, 因为@[]创建出来的是一个不可变的数组
- 如果把一个不可变数组当做一个可变数组来使用, 会引发一个运行时的错误