二、NSMutableString
176.NSMutableString
1). 是Foundation框架中的一个类,从NSString继承,是用来存储字符串数据的.
2). NSMutableString在父类NSString的基础之上做扩展,
存储在NSMutableString对象中的数据具有可变性,不会新创建对象.
177. NSMutableString的用法
1). 创建对象:
NSMutableString *str = [NSMutableString string];
[str appendString:@"jack"];
// 追加字符串。
2). 往可变字符串对象中追加字符串:
(void)appendString:(NSString *)aString;
// 直接追加内容
(void)appendFormat:(NSString *)format...;
// 以拼接的方式往可变字符串对象中追加内容
3). 创建NSMutableString对象时,不能使用如下方式:
NSMutableString *str = @"jack";
4). NSMutableString做大批量的字符串拼接,速度快,因为NSMutableString只有一个,每次修改的时候直接修改对象的内容。
NSMutableString是从NSString继承,在使用NSString的地方,完全可以使用NSMutableString。
6. 使用建议
1). 平时使用,还是使用NSString,因为效率高。
第二次使用同1个字符串,不需要再创建,可直接使用。
NSString *str1 = @"jack";
NSString *str2 = @"jack";
2). 大批量的数据拼接的时候使用NSMutableString
10次以上使用NSMutableString. 此时NSString拼接,效率低下。
178. NSArray的用法
1. NSArray,具备数组功能。是OC中的数组。
1). 是Foundation框架中的一个类,用来存储多个数据,具备数组功能,所以NSArray是OC中的数组
2). NSArray的特点:
a. 只能存储OC对象
b. 长度固定, 一旦NSArray数组创建完毕之后,元素的长度固定,无法新增、删除元素.
c. 每一个元素都是紧密相连的,每一个元素仍然有自己的下标.
d. 元素的类型是id类型的.只能存OC对象类型。
3). NSArray数组的创建:
1). 因为是一个类,所以就是创建NSArray对象.
NSArray *arr1 = [NSArray new];
NSArray *arr2 = [[NSArray alloc] init];
NSArray *arr3 = [NSArray array];
这样创建出来的NSArray数组的元素的个数是0个,因为长度固定,所以没有任何意义.
2). 创建数组的同时指定一个数组的元素,仍然没有意义
NSArray *arr1 = [NSArray arrayWithObject:@"jack"];
3). 最常用创建NSArray数组的方式.
- (instancetype)arrayWithObjects:(ObjectType)firstObj,...
NSArray *arr1 = [NSArray arrayWithObjects:@"jack",@"rose",@"lili",nil];
4). 创建NSArray简要方式
NSArray *arr = @[@"jack", @"rose", @"lili"];
5). 使用注意
a. 只能存储OC对象,不能存储非OC对象
b. 将元素写完之后,最后要写一个nil,表示元素到此结束了
179. NSArray的用法
- 在NSLog函数中使用%@可以直接输出 NSArray对象中的所有元素的值。
- NSArray数组中不能存储基本数据类型。不能存储非OC对象。
nil的本质其实就是0,所以nil无法存储到NSArray数组中。 - 可以通过下标index,取出数组中的值。
- 得到数组中元素的个数:arr.count;
- 判断数组中是否有指定元素:[arr containsObject:@"lily"];
- 第一个元素:arr.firstObject
- 最后元素:arr.lastObject
- 查找数组中第一次出现item的下标。
indexOfObject,如果没找到,返回的是NSUInteger的最大值。
180. NSArray的用法
NSArray数组的编译
1). for循环
原理: 将下标挨个遍历出来
NSArray *arr = @[@"jack",@"rose"];
for(int i=0;i<arr.count;i++){
//NSLog(@"%@",arr[i]);
NSLog(@"%@", [arr objectAtIndex:i]);
}
2). 使用增强for循环
a. 语法格式:
for(元素类型 变量名 in 数组名){
直接通过变量名拿到数组中的每一个元素
}
NSArray *arr = @[@"jack",@"rose"];
for(NSString *str in arr){
NSLog(@"%@", str);
}
b. 声明在for()中的变量叫做迭代变量
c. 执行变量
将数组中的第一个元素的值赋值给迭代变量,执行循环体
...
结束循环
d. 语法总结
-> 迭代变量的类型和数组中的元素的类型保持一致
-> 迭代变量的名称可以任意取
-> in是固定的
-> 遍历那个数组就将数组写在in后面
-> 循环体里面,迭代变量的值就是元素的值
当NSArray数组中存储的数据类型不一致的时候,迭代变量的类型建议使用id类型
3). 使用block遍历:enumerateObjectsUsingBlock
(void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;
idx:是每个元素的下标index。
obj:代表遍历出来的元素的值。
*stop:是否继续遍历的标志,YES停止,NO不停止。
这是一个方法,这个方法作用来遍历数组中的每一个元素
NSArray *arr = @[@"jack",@"rose"];
// 将arr数组中的每一个元素遍历出来
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){
NSLog(@"%@", obj);
// 如果想停止循环,就将*stop设置为YES
}];
NSArray和NSString 的方法。
1). 将数组中元素连接起来组成一个新的字符串
(NSString *)componentsJoinedByString:(NSString *)separator
参数: 连接符
NSArray *arr = @[@"jack", @"rose", @"lili"];
NSString *str = [arr componentsJoinedByString:@"#"];
2). 将字符串按指定分隔符分割
NSString *str = @"北京,昌平区,传智";
// 使用字符串进行分割
NSArray *arr = [str componentsSeparatedByString:","];
NSMutableArray是NSArray的子类
1). NSMutableArray仍然是一个数组,就被NSArray的特点,只能存储OC对象,每一个元素是紧密相连的。
2). NSMutableArray相对于父类做的扩展,NSMutableArray数组的元素可以动态的新增和删除,其他用法与NSArray一致。
所以:
NSArray数组一旦创建,其元素的个数就固定,无法新增与删除
NSMutableArray数组,可以新增删除.
3). NSMutableArray数组的创建
NSMutableArray *arr1 = [NSMutableArray new];
NSMutableArray *arr2 = [[NSMutableArray alloc] init];
NSMutableArray *arr3 = [NSMutableArray array];
NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"jack", @"rose", @"lili", nil];
这样创建出来的数组对象,数组的元素是0,但是有意义,可以动态的新增,删除.
最容易犯错:这样写不可以. 这时NSArray对象的简写。
NSMutableArray *arr1 = @[@"jack", @"rose", @"lili"];
新增与删除
新增
a. // 将传入的参数作为数组的元素添加进去
- (void)addObject:(ObjectType)anObject;
// 将另外一个数组中的每一个元素添加到可变数组中
- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
b. 在可变数组中指定的数组中插入一个元素
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
[arr insertObject:@"lilei", atIndex:1];
// 可变数组的中间,插入元素
删除
a. 删除
// 删除指定下标的元素
- (void) removeObjectAtIndex:(NSUInteger)index;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeObjectAtIndex:1];
b. 删除特定的元素
- (void)removeObject:(ObjectType)anObject;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeObject:@"lili"];
c. 删除指定范围内的元素
- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeObject:@"lili" inRange:NSMakeRange(0, 3)];
d. 删除最后一个元素
- (void)removeLastObject;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeLastObject];
e. 删除所有
- (void)removeAllObjects;
NSMutableArray *arr1 = [NSMutableArray new];
[arr1 addObject:@"jack"];
NSArray *arr = @[@"jack", @"rose", @"lili"];
[arr1 addObjectsFromArray:arr];
[arr removeAllObjects];
183. NSNumber
无论是NSArray还是NSMutableArray,里面只能存储OC对象。基本数据类型是无法存储的。
解决方案:先用一个OC对象,将基本数据类型包装,再将这个对象放到NSArray中。
NSNumber
1). 作用: 包装基本数据类型.
NSNumber *number = [NSNumber numberWithInt:10];
等价于
NSNumber *number = @10;
// 简写方式。
// @10: 代表是1个NSNumber独享,这个对象中包装的是整型的10.
NSLog(@"%d", number.intValue);
// 从NSNumber中取值。
注意:如果后面的数据是1个变量,这个变量就必须使用小括号括起来。
int num =10;
NSNumber *number = @(num);