OC知识梳理-NSArray与NSMutableArray相关知识

知识普及:

1、数组中的元素在系统中都会有其默认对应的下标,下标是一个整形的数字,默认从0开始。

例:NSArray *arr3 = @["345","234","23"];

则当我们要取出数组中第一个元素时,有  arr3[0]= "345";如果出现我们要取出arr[3]时,程序会报错,因为此时的数组只有3个元素,对应的下标为0、1、2,没有3,这种情况我们称之为越界

2、在oc中汉字不能被直接打印出来,需要遍历操作;

3、数组中只能放对象

 

一、两者特点与区别:

1、NSArry为静态数组(不可变数组),不能改动数组中的元素;

2、NSMutableArray为动态数组(可变数组),可变动(增、删、改、换)其中的元素;

 

二、两者常用到的方法:

1、NSArry函数的几种常用方法

获取

  • -(NSUinteger)count    获取数组的元素个数
  • -(void)objectAtIndex:(NSUinteger)index    获取索引位置(index)的元素
  • -(undesigned)indexofObjext:(id) object   获取一个id类型的元素的位置

判断

  • -(BOOL) countainsobject:(id)    判断是否包含一个id类型的对象

循环遍历(for循环、枚举器遍历、快速遍历)

  • 具体方法见下面的实例

数组排序(调用方法排序、block(代码块)排序、描述法排序)

  • 具体方法见下面的实例

 

2、NSMutableArry函数的几种常用方法

     由于NSMutableArry是NSArry的子类,故而NSArry中的方法都可使用,但我们要谨记的是:NSMutableArry是可变数组,具体情况我们还要具体对待。

添加元素

  • -(void)addObject:(id)object    添加一个id类型的元素
  • -(void)insertObject:(id)object  atIndex:(NSUinteger)index    在索引位置插入一个id类型的元素
  • -(void)addObjectFromArray:(NSArray *)arry    将一个数组的全部元素添加到现有数组的末尾

删除元素

  • -(void)removeObject:(id)object    移除数组中的特定元素
  • -(void)removeObjects    删除所有元素
  • -(void)removeObjectAtIndex:index    删除索引位置的元素

改动元素

  • -(void)replaceObjectAtIndex:index  withObject:(id)object     用特定元素替换索引位置的元素
  • -(void)exchangeObjectAtIndex:index1 withObjectAtIndex:index2    交换两个索引位置的元素

循环遍历(for循环、枚举器遍历、快速遍历)

  • 具体方法见下面的实例

数组排序(调用方法排序、block(代码块)排序、描述法排序)

  • 具体方法见下面的实例

 

三、实例展示

1、NSArray(不可变数组)

  • 初始化一个数组的三种方法

法一:初始化一个空数组

NSArray *arr1 = [NSArray array];

法二:初始化一个n元素的数组(n>=1):

NSArray *arr2 = [NSArray arrayWithObjects:@"1",@"zhang san",@"ABXZ", nil];

注意当n=0时,“Objects”改为“Object”, 数组中没有“,nil”。

法三:直接给一个数组赋值

NSArray *arr3 = @[@"zhangsan",@"张三",@"23"];

注意:此时数组中有汉字,故而不能直接打印,要通过遍历才能将结果正确打印出来,具体操作见下面的程序段。

  • 数组中元素个数

NSUInteger count=arr3.count;

NSLog(@"count=%ld",count);

  • 数组中某元素的位置

unsigned long int i = [arr3 indexOfObject:@"234"];
NSLog(@"i = %ld",i);

  • 循环遍历

法一:for循环遍历

for (int i = 0; i < arr3.count; i++) {
      NSString *str = arr3[i];
      NSLog(@"%@",str);

}

法二:枚举器遍历

  • 获取数组所有元素的枚举器
NSEnumerator *e = [arr1 objectEnumerator];
      NSString *obj;
      while(obj = [e nextObject]){
            NSLog(@"---%@",obj);
      }

注意:while循环中的“nextObject”在第一次循环时,其指向的是枚举器“e”中的第一个元素,每一次循环回来,它都会自动指向下一个元素,当它指向最后一个元素,并完成此次循环后,他会指向“nil”(空字符),此时循环结束。

法三:快速遍历

       for (id obj1 in arr1) {
            NSLog(@"obj1 = %@", obj1);
       }

通过以上三种方法,都可得出以下结果:

2015-11-07 15:43:03.711 实验 [1862:84687] zhangsan
2015-11-07 15:43:03.712
实验 [1862:84687] 张三
2015-11-07 15:43:03.712 实验 [1862:84687] 1234

 

2、NSMutableArry(可变数组)

初始化一个可变数组对象

法一:初始化一个空对象

同NSArray;

法二:初始化一个容量为n的空对象

NSMutableArray *arr1 = [NSMutableArray arrayWithCapacity:n];

注意:这里初始化的容量“n”比为非负整数,表示为创建的数组分配的内存空间。

法三:初始化一个有多个元素的数组

同NSArray;

NSMutableArray *arr2 = [NSMutableArray arrayWithObjects:@"34",@"22",@"35", nil];

注意:NSArray中的第三种方法在这里不能用,因为NSArray 的第三种方法初始化的数组是不可变的,如果用在可变数组中没有意义。

  • 在数组末尾添加一个元素

[arr2 addObject:@"23"];

  • 将一个数组中的所有元素添加到现有数组的末尾

[arr2 addObjectsFromArray:@[@"21",@"82"]];

  • 在索引位置添加元素

[arr2 insertObject:@"360" atIndex:3];

注意键入索引时,要保证索引的合理性,不能越界。

  • 移除特定位置的元素

[arr2 removeObjectAtIndex:2];

  • 替换索引位置的yuansu

[arr2 replaceObjectAtIndex:1 withObject:@"abc"];

  • 遍历数组中的元素

for (NSString *s in arr2) {
      [arr1 removeObject:@"1"];
      NSLog(@"arr1=%@",s);
}

注意:在为可变数遍历时,不能对其变动(增、删、改、换)。

 

3、数组的运用

  • copy数组

当我们在使用NSArray对应给另一个数组进行赋值时,直接赋值会报错,我们可以使用mutableCopy

    NSMutableArray *a1 = [NSMutableArray arrayWithObject:@"1"];
    NSArray *a2 = [NSArray arrayWithObject:@"2"];
    a1 = [a2 mutableCopy];
    a2 = [a1 mutableCopy];
    
    NSLog(@"%@   %@",a1,a2);

结果为:[2487:199321] (
    2
)   (
    2
)

有次我们不难看出,使用mutableCopy方法,只适用于可变数组NSMutableArray,一旦NSArray初始化完毕,既不可更改。

  • 扩充数组

我们在网络请求时,往往会用到数组承接数据,但当我们遇到因网速不好/参数错误/借口错误等因素导致获取数据失败时,系统会自动报错。显示的错误信息时:数组无法添加一个空值。

因此在此种类似的情况下,我们就要在添加对象之前进行判断。

 

转载于:https://www.cnblogs.com/linzhengbo/p/4950616.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值