【NSArray数组的使用 Objective-C语言】

这篇博客详细介绍了Objective-C中NSArray的使用,包括如何创建和初始化数组、使用下标和objectAtIndex:方法获取元素、数组的count属性、containsObject:方法判断元素是否存在、firstObject和lastObject属性以及indexOfObject:方法查找元素下标。同时,文章还讨论了nil不能存储在NSArray中以及下标越界的处理。

一、例如,我要把@“jack”,@“rose”,@"lili"存到我的NSArray数组里面去

1.NSArray *arr = @[@“jack”,@“rose”,@“lili”];

这个时候,表示我创建了1个NSArray数组,这个数组有3个元素,这3个元素的值分别是@“jack”,@“rose”,@“lili”

2.好了,接下来我们说这个数组该怎么用

1)我要在NSLog里面,打印出这个数组中所有元素的值

直接用%@,打印这个数组arr就可以了

NSLog(@“%@”,arr);

这样的话,它就会去输出这个数组里面所有元素的值

输出:(

jack

rose

lili

1)所以,第一种啊,在这个NSLog函数中使用%@可以直接输出NSArray对象中的所有的元素的值

2)第二点啊,NSArray数组中不能存储基本数据类型,不能存储非OC对象

所以,我这儿给个nil

NSArray *arr = @[@“jack”,@“rose”,@“lili”,nil];

报错

报错的原因,这个nil其实本质上是个0

你若不信,点nil,点右键,JUMP TO DEFINITION

它是个typedef,是个宏

#typedef nil __DARWIN _NULL

再看这个__DARWIN_NULL是什么东西啊

再点右键,再JUMP TO DEFINITION

#typedef __DARWIN_NULL ((void *)0)

是不是就是个0啊,0就是基本数据类型嘛,对不对

所以这个nil是没法存进去的啊

nil的本质其实就是0,所以nil无法存储到NSArray数组中

这是第二点

3)通过这三种方式创建数组,没有任何意义

NSArray *arr1 = [NSArray new];

NSArray *arr2 = [[NSArray alloc] init];

NSArray *arr3 = [NSArray array];

为什么这样创建数组没有任何意义呢,因为这样创建数组是没有元素的

而NSArray数组的元素无法新增和删除,所以没有任何意义

2.我把@“jack”,@“rose”,@"lili"存储到数组里面之后,我想取出数组里面元素的值,应该怎么取呢

NSArray *arr = @[@“jack”,@“rose”,@“lili”];

我们说,这三个元素的下标是0,1,2,对不对

如何取出数组中元素的值

怎么去取呢,有两种方式,第一种方式,你猜,是什么

是不是下标啊

arr[0];

这个时候,是不是就取到我们第0个元素了

我们试一下啊

NSLog(@“%@”,arr[0]);

输出:jack

再来一个

NSLog(@“%@”,arr[1]);

NSLog(@“%@”,arr[2]);

输出:

jack

rose

lili

1)所以第一种方式,可以使用下标取出对应的元素的值

好了,有个问题是什么问题呢,我下标越界了,该怎么办呢

在C语言当中,如果下标越界会报错吗 ,不会,是不是垃圾值啊

NSLog(@“%@”,arr[3]);

下标越界直接报错

index 3 beyond bounds [0…2]

beyond什么意思啊,是不是穿越啊,已经穿越了这个范围了

如果下标越界,就直接运行报错

2)既然这个NSArray是个对象,那么它是不是应该提供方法来取值啊

是的,它有个对象方法啊,叫做objectAtIndex:(NSUInteger)index

例如,给它一个下标,例如1

[arr objectAtIndex:1];

它就会取到这个数组里面下标为1的这个元素,也就是@“rose”

来一个NSString类型的对象接一下

NSString *str = [arr objectAtIndex:1];

NSLog(@“%@”,str);

输出:rose

有人说,越界怎么办,越界一样,报错嘛

这个方法的签名如下:

- (ObjectType)objectAtIndex:(NSUInteger)index;

所以,第二种方式,调用数组对象的对象方法来取出指定下标的元素的值

我突然发现个新东西,这个ObjectType什么意思啊

是不是返回值是ObjectType吧

跳到定义,跳不过去了

在7.0之前,是个id

翻译一下,是对象类型嘛

好了,这就是去取出存储在NSArray数组中元素的值

二、NSArray数组其他的常用方法

1.得到数组里面有多少个元素,

怎么办,是不是sizeof,sizeof可不可以,绝对必须不可以

sizeof(arr)/

来,怎么算,除几,

除8行不行

sizeof(arr)/8

肯定不行,你sizeof(arr),是不是算的这个arr指针变量的空间啊,几个,8个啊,

arr这是个指针变量,后面这个才是对象:@[@“jack”,@“rose”,@“lili”];

好了,我要去得到这个NSArray数组里面有多少个元素,它有一个属性,叫做count

arr.count

转到定义,看一下啊

@property (readonly) NSUInteger count;

其实是个@property

1)得到NSArray数组中的元素的个数,通过这个count就能得到

当然,你可以用点语法,也可以用[arr count]

因为这是@property嘛,

这个@property什么意思

第一,生成一个私有的NSUInteger的_count属性

第二,生成一个getter方法的声明,有setter吗,没有,因为是readonly啊

第三,然后再生成getter方法的实现,就可以了

它那个实现怎么实现的

是不是就返回当前这个数组里面有多少个元素啊

我们试试打印一下看看行不行啊

NSLog(@“arr.count = %lu”,arr.count);

输出:3

你以前用C语言的数组时,你还要苦逼地sizeof算啊算,然后你当作参数传这个数组时候,长度还会丢失,

现在用这个NSArray对象呢,不用了,点count就能直接拿到这个数组中元素的个数

2.判断NSArray数组中是否包含指定的元素

例如,我这个数组,数组里面是不是有@“jack”,@“rose”,@“lili”,@"hanmeimei"啊

NSArray *arr = @[@“jack”,@“rose”,@“lili”,@“hanmeimei”];

现在,我想判断一下,这个数组里面是否有@"lili"这个元素

要是在C语言里面,是不是遍历,判断,相等,巴拉巴拉。。。

我告诉你啊,在NSArray里面不用这么

因为它已经提供一个方法给你了,你只要调就可以了

这个方法叫做:

[arr containsObject:(nonnull id)];

数组是否包含这个元素呢

[arr containsObject:@“lili”];

返回值是BOOL类型的,我拿BOOL类型的变量接一下

BOOL res = [arr containsObject:@“lili”];

NSLog(@“res = %d”,res);

输出:res = 1

那我看看里面有没有lilei呢

BOOL res = [arr containsObject:@“lilei”];

NSLog(@“res = %d”,res);

输出:0

这个方法的签名如下:

- (BOOL)containsObject:(ObjectType)anObject;

所以,这是第二个啊,判断NSArray数组中是否包含指定的元素

3.我现在要取到这个数组中的第1个元素,怎么取

arr[0],是不是0啊

这样就可以拿到第一个元素吧

但是还有另外一种方式啊

arr.firstObject;

这个方法的签名如下:

@property(nullable,nonatomic,readonly) ObjectType firstObject;

这是个@property

取到这个NSArray数组中的第一个元素

好,我们试一下啊

NSLog(@“%@”,arr.firstObject);

输出:jack

这个arr.firstObject和arr[0]有区别吗

例如,我这个数组如下:

NSArray *arr = @[];

数组里什么都没有,那如下这个语句,拿到的arr[0]是什么

NSLog(@“%@”,arr[0]);

拿到的arr[0]是直接报错

因为你下标越界了嘛

但是我用arr.firstObject呢

NSLog(@“%@”,arr.firstObject);

拿到的就是nil

输出:(null)

firstObject与arr[0]的区别

如果数组中没有任何元素,arr[0]运行报错

而这个firstObject呢,取到nil,不报错

4.取到最后一个元素,

arr.lastObject

这个方法的签名如下:

@property (nullable,nonatomic,readonly) ObjectType lastObject;

取到NSArray数组中的最后一个元素

这个和arr[2]的区别,如果这个数组里面一个都没有,arr[2]就会报错,arr.lastObject不会报错

5.查找指定的元素在NSArray数组中第一次出现的下标

例如,查找@"rose"在这个数组里面第一次出现的下标

NSArray *arr = @[@“jack”,@“rose”,@“lili”,@“hanmeimei”];

C语言中应该怎么写,是不是遍历,判断相等,然后返回计数器

好了,NSArray数组不用

直接indexOfObject:(nonnull id)

[arr indexOfObject:@“rose”];

这个时候,它会做什么事情呢,它就去找@"rose"在这个数组中第一次出现的下标

返回值什么类型的,NSUInteger类型的

这个方法的签名如下:

- (NSUInteger)indexOfObject:(ObjectType)anObject;

NSUInteger 类型,其实就是unsigned long

好,打出来看看啊

NSArray *arr = @[@“jack”,@“rose”,@“lili”,@“hanmeimei”];

NSUInteger index = [arr indexOfObject:@“rose”];

NSLog(@“index = %lu”,index);

输出:index = 1

那如果我多来几个元素呢

NSArray *arr = @[@“jack”,@“rose”,@“lili”,@“jack”,@“rose”,@“lili”];

这里面是不是两个@"rose"啊

它返回的是几,还是1

第一次出现的下标

那要是没找到呢,例如,找个@“lilei”

可不可能是0,绝对不可能是0,

因为@"jack"是不是0下标啊

是index = 9223372036854775807

NSUInteger的最大值

如果没有找到,返回的是NSUInteger的最大值9223372036854775807

所以,你如果要判断有没有找到,只需要判断一下

if(index == NSNotFound)

{

NSLog(@“没有找到。”);

}

我们说过,NSNotFound是不是就是NSUInteger的最大值啊

else

NSLog(@“index = %lu”,index);

以上,就是NSArray数组的常用方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值