NSArray和NSMutableArray

一、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];

 

猜你喜欢

转载自qianjiangbing.iteye.com/blog/2287599
今日推荐