一、NSArray
1.NSArray是Foundation框架中的1个类,是OC中的数组,NSArray对象是1个数组对象,存储多个数据的。
首先我们来回顾一下C语言的数组有哪些特点:
a.元素类型相同
b.长度固定
c.每个元素是连续的。
好,那么OC的数组有哪些特点?
a.NSArray数组中只能存储OC对象,非OC对象无法存储。
b.长度固定,一旦创建,数组中的元素无法新增和删除,甚至元素的值都无法更改。
c.NSArray数组中的每一个元素扔然是连续的,仍有下标/索引。
d.NSArray数组的元素的类型是id类型的。
2.NSArray数组的创建。
首先它是一个类,要创建对象才可以使用。
NSArray * arr1 = [NSArray new]; NSArray * arr2 = [[NSArray alloc] init]; NSArray * arr3 = [NSArray array];
这么创建出来的数组的元素的个数是0个,没有意义的,因为NSArray数组是无法新增数组元素的。
NSArray *arr = [NSArray arrayWithObject:@"jack"];
创建了1个长度为1的数组,数组的元素的值为@"jack",这样写也没有意义的,原因你懂的,因为数组不可新增元素了。
3.买了这么多官司,就是为了等待下面激动人心的时刻,数组常用的几种方式:
3.1用类方法创建数组
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NSArray *arr1 = [NSArray arrayWithObjects:@"jack",@"rose",@"lily",@"lelei",nil];
创建1个NSArray数组.并指定数组的元素的值.将每1个元素的值挨个挨个的写好.当所有的元素写完毕之后,记住后面跟1个nil,这个时候nil代表结束. 代表元素在这个地方结束.
强调:a.当我们将所有的元素写完以后,最后一定要跟1个nil,表示结束。
b.如果把你nil放在前面,就会认为元素到此结束。
c.NSArray只能存储OC对象,其他的别想了。
4.最常用的创建NSArray数组的方式。
创建NSArray对象的简写方式。
NSArray * arr = @[@"jack",@"rose",@“lucy”];
记住这种写法后面就不需要加nil了。
因为NSArray数组是无法存储非OC对象的,nil的本质就是0是基本数据类型。
5.NSArray数组的使用
a.使用%@就可以直接输出NSArray数组中的元素的值,需要注意的是,如果存储的是中文字符,输出的就是这个中文字符的Unicode编码。用%@打印整改NSArray数组对象的时候,如果元素是字符的中文,就会有乱码。
b.NSArray数组不能存储nil.
1.使用中括号写下标来取出指定的元素的值。
NSArray *arr = @[@"jack",@"rose",@"lily",@"jim",@"lilei",@"中文"]; NSLog(@"arr[1] = %@",arr[5]); 需要注意的时候,如果使用下标取出来的元素是1个中文字符串,是可以正常输出的.
调用数组对象方法也是可以取出指定下标的元素的值。
- (ObjectType)objectAtIndex:(NSUInteger)index; ObjectTyoe ---- id
6. NSArray数组对象的其他的常用方法
1). 得到数组的长度. 得到数组的元素的个数. @property (readonly) NSUInteger count; 2). 获取数组中指定下标元素的值. - (ObjectType)objectAtIndex:(NSUInteger)index; 如果下标越界,运行必报错. 3). 判断数组中是否包含指定的元素. - (BOOL)containsObject:(ObjectType)anObject; 4). 取到数组中的首个元素. @property (nullable, nonatomic, readonly) ObjectType firstObject 如果使用下标0去取,如果数组的长度为0 那么就会报错. 如果使用firstObject取,就返回nil 不会报错. 5). 取到数组中的末尾元素. @property (nullable, nonatomic, readonly) ObjectType lastObject; 6). 查找指定的元素在数组中第1次出现的下标. - (NSUInteger)indexOfObject:(ObjectType)anObject; 如果没有找到,就返回NSNotFound.就是NSUInteger的最大值.
7.变量NSArray数组
1)使用for循环,将每一个元素的下标变量出来,通过下标取值
NSArray *arr = @[@"jack",@"rose",@"lili",@"lilei",@"中文"]; for(int i = 0; i < arr.count;i++) { NSLog(@"%@",arr[i]); NSLog(@"%@",[arr objectAtIndex:i]); }
2)使用循环增强来遍历。
a.语法格式
for(元素类型 变量名 in 数组名){
变量名的值就是数组中每1个元素的值
}
执行原理:
将数组中第0个元素的值赋给迭代变量,然后执行循环体。
将数组中第1个元素的值赋给迭代变量,然后执行循环体
将数组中第2个元素的值赋给迭代变量,然后执行循环体
将数组中第3个元素的值赋给迭代变量,然后执行循环体
将数组中第4个元素的值赋给迭代变量,然后执行循环体
。。。。。
将数组中最后一个元素的值赋给迭代变量,然后执行循环体。
自动结束循环。
再次强调如何使用增强for循环来变量数组
-迭代变量的类型写数组中真正存储的数据的类型。
-迭代变量的名称可以自己随便写,因为这只是一个变量,当然最好可读性高。
-in是固定的其实跟java的增强for循环格式一样,只是java里使用了:而不是in
-要遍历那个数组就把那个数组写在in后面就OK了
-在循环体中,迭代变量的值就是数组元素中的每一个元素的值。
- 如果数组中存储的数据类型不一致,迭代变量建议使用id
3)使用block来遍历NSArray数组
- (void)enumerateObjectsUsingBlock:(void (^)(objectType obj, NSUIneger idx, BOOL *stop))block
这个方法的作用是遍历数组中的每一个元素。
NSArray *arr = @[@"jack",@"rose",@"lily"];
[arr enumerateObjectUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){
//obj:遍历出来的这个元素的值
//idx:遍历出来的这个元素的下标
NSLog(@"arr[%lu] = %@", idx,obj);
//如果想要停止遍历,就给这个stop指针指向的变量赋值为YES
if(idx == 2)//如果下标为2的时候就停止遍历了。
{
*stop = YES;
}
}];
8.NSArray与字符串相关的方法。
a使用指定的分隔符将数组中的每一个元素拼接成1个新的字符串。
- (NSString *)componentsJoinedByString:(NSString *)separator;
NSArray *arr = @[@"jack",@"rose",@"lili",@"lilei",@"中文"]; NSString *str = [arr componentsJoinedByString:@""];
以指定的字符串分割
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
二、NSMutableArray
1.是Foundation框架的一个类,它是NSArray的子类
所以NSMutableArray和NSArray一样,也是一个数组。
并且NSArray具备的功能,NSMutableArray一样肯定都有
NSMutableArray是一个可变的数组,这个数组中的元素可以新增和删除
2.NSMutableArray的创建
NSMutableArray *arr1 = [NSMutableArray new]; NSMutableArray *arr2 = [[NSMutableArray alloc] init]; NSMutableArray *arr3 = [NSMutableArray array];
这种方式创建出来的数组长度为0,但是这个是有意义的,因为这个数组的元素是可以动态的新增和删减的
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... 这样创建也是可以的.但是一样 最后给1个nil
特别注意这样是不行的
NSMutableArray *arr = @[@"jack", @"rose",@"lily"];
@[@"jack", @"rose",@"lily"];这是创建NSArray简写的方式,是1个NSArray对象
3.NSMutableArray数组新增元素
1)NSMutableArray数组刚创建的时候,这个数组的长度为0.
每新增1个元素,才动态为这个数组新增一个元素。
2)新增的方法
- (void)addObject:(ObjectType)anObject;
将数组中的每一个元素取出来新增到当前这个可变的数组中。
- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
NSMutableArray *arr = [NSMutableArray array]; NSArray *arr1 = @[@"hehe",@"haha",@"hehe1"]; [arr addObjectsFromArray:arr1]; NSLog(@"%@",arr);
4.删除元素
1)根据下标来删除元素
- (void)removeObjectAtIndex:(NSUInteger)index;
2)删除数组中的最后一个元素
- (void)removeLastObject;
3). 清空数组中的所有的元素. - (void)removeAllObjects; 4). 删除数组中指定的元素. - (void)removeObject:(ObjectType)anObject; 所有删除. 5). 删除指定范围的元素 - (void)removeObject:(ObjectType)anObject inRange:(NSRange)range; 6). 元素的插入: - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
[arr removeObject:@"rose31111"];
[arr removeObject:@"rose3"inRange:NSMakeRange(5, 2)];
[arr removeObjectAtIndex:0];
[arr removeLastObject];
[arr removeAllObjects];