NSArray简单细说(四)—— 数组的查询与检索

版本记录

版本号 时间
V1.0 2017.08.24

前言

NSArray是集合类型中的一种,是OC中很重要的概念,这个是我们一定会用到的对象,下面我就继续由整体到细节,由简单到复杂的和大家说一下它的用法。感兴趣的可以看我写的上篇几篇。
1. NSArray简单细说(一)—— 整体了解
2. NSArray简单细说(二)—— 数组的创建
3. NSArray简单细说(三)—— 数组初始化

一、- (BOOL)containsObject:(ObjectType)anObject;

该方法的作用是:判断给定的对象是否在数组中。

还有几点需要注意:

  • 从索引0开始,数组的每个元素作为参数传递给发送到aObject的isEqual:,直到找到匹配或达到数组的结尾。 如果isEqual :(在NSObject协议中声明)返回YES,则对象被认为是相等的。

下面我们看一下代码

- (void)demoContainsObject
{
    NSArray *arr = @[@"How", @"are", @"you"];
    
    if ([arr containsObject:@"are"]) {
        NSLog(@"It is in the arr");
    }
    else {
        NSLog(@"It is  not in the arr");
    }
}

下面看输出结果

2017-08-25 08:55:48.918 JJOC[1190:18461] It is in the arr

结论:很简单,扫一眼就可以了。


二、@property(readonly) NSUInteger count;

该属性的作用就是:获取数组中元素的个数,这个很有用,特别是在判断数组越界还有遍历的时候都是经常用到的。

结论:很简单,扫一眼就可以了。


三、- (void)getObjects:(ObjectType _Nonnull [])objects;

该方法的作用就是:将数组中包含的所有对象复制到aBuffer

还要几点需要注意:

  • 这种废弃使用的方法是不安全的,因为它可能会导致缓冲区溢出。
  • 该方法将复制到缓冲区中的所有对象中; 因此,缓冲区的大小必须至少与数组的计数乘以对象引用的大小,如以下示例所示(请注意,这仅仅是一个示例,您通常不应该创建一个缓冲区来简单地迭代 数组的内容)。
NSArray *mArray = // ...;
id *objects;
 
NSUInteger count = [mArray count];
objects = malloc(sizeof(id) * count);
 
[mArray getObjects:objects];
 
for (i = 0; i < count; i++) {
    NSLog(@"object at index %d: %@", i, objects[i]);
}
free(objects);

结论:看看就可以了,用的很少,而且已经被废弃了。


四、- (void)getObjects:(ObjectType _Nonnull [])objects range:(NSRange)range;

该方法的作用就是:将包含在指定范围内的数组中的对象复制到aBuffer

下面我们看一下参数:

  • 尺寸至少为aRange指定范围长度的C数组对象。
  • 数组范围内的范围。如果位置加上范围的长度大于数组的长度,则此方法会引发NSRangeException

还有几点需要注意:

  • 该方法将在aRange指定的范围内复制到缓冲区中的数组中的对象; 因此,缓冲区的大小必须至少为范围的长度乘以对象引用的大小,如以下示例所示(这仅仅是为了说明 - 您通常不应该创建一个缓冲区来简单地迭代内容 的数组)。
NSArray *mArray = // an array with at least six elements...;
id *objects;
 
NSRange range = NSMakeRange(2, 4);
objects = malloc(sizeof(id) * range.length);
 
[mArray getObjects:objects range:range];
 
for (i = 0; i < range.length; i++) {
    NSLog(@"objects: %@", objects[i]);
}
free(objects);

结论:这个用的少,看看就可以。


五、@property(nonatomic, readonly) ObjectType firstObject;

该属性的作用就是:获取数组中的第一个元素,其实就是脚标为0的元素,如果数组为空那么就会返回nil。

结论:很常用,很简单。


六、@property(nonatomic, readonly) ObjectType lastObject;

该属性的作用就是:获取数组中的最后一个元素,其实就是脚标为count - 1的元素,如果数组为空那么就会返回nil。

结论:很常用,很简单。


七、- (ObjectType)objectAtIndex:(NSUInteger)index;

该方法的作用就是:获取指定脚标对应的元素。

这里还要注意:如果index超出了数组的结尾(也就是说,如果index大于或等于count返回的值),则引发NSRangeException

下面看代码

- (void)demoObjectAtIndex
{
    NSArray *arr = @[@"How", @"are", @"you"];
    
    NSString *obj = [arr objectAtIndex:0];
    NSLog(@"obj = %@", obj);
}

下面看输出结果

2017-08-25 09:19:01.267 JJOC[1819:32852] obj = How

结论:很常用,很简单。


八、 (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx;

该方法的作用就是:获取数组中指定索引对应的对象。

还有几点需要注意:

  • 该方法与objectAtIndex:方法具有相同的行为。如果index超出了数组的结尾(也就是说,如果index大于或等于count返回的值),则引发NSRangeException。您不应该直接调用此方法。 而是使用下标通过索引访问对象时调用此方法。
id value = array[3]; // equivalent to [array objectAtIndex:3]

结论:很简单,并不常用。


九、- (NSArray<ObjectType> *)objectsAtIndexes:(NSIndexSet *)indexes;

该方法的作用就是:返回一个数组,它包含数组中由给定索引集指定的索引的对象。

还有几点需要注意:

  • 返回的对象按索引中的索引的升序排列,因此索引中索引较高的返回数组中的对象将跟随索引中索引较小的对象。如果索引中的任何位置超出了数组的边界,则引发NSRangeException,索引为nil。

下面我们看代码

- (void)demoObjectsAtIndexes
{
    NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)];
    NSArray *arr = @[@"How", @"are", @"you"];
    NSArray *resultArr = [arr objectsAtIndexes:set];
    NSLog(@"resultArr = %@", resultArr);
}

下面看输出结果

2017-08-25 09:29:34.482 JJOC[2190:39175] resultArr = (
    How,
    are
)

结论:有时候也会用到,很简单,可以看看。


十、- (NSEnumerator<ObjectType> *)objectEnumerator;

该方法的作用就是:返回一个枚举器对象,允许您访问数组中的每个对象。返回值是一个枚举器对象,允许您按顺序从最低索引的元素向上访问数组中的每个对象。

还要几点需要注意:

  • 当您使用此方法与NSArray的可变子类时,您不能在枚举期间修改数组。使用快速枚举协议(参见NSFastEnumeration)更为有效。 macOS 10.5及更高版本以及iOS 2.0及更高版本中提供快速枚举。

下面看一下代码

- (void)demoObjectEnumerator
{
    NSArray *arr = @[@"How", @"are", @"you"];
    
    NSEnumerator *enumerator = [arr objectEnumerator];
    id anObject;
    
    while (anObject = [enumerator nextObject]) {
        NSLog(@"anObject = %@", anObject);
    }
}

下面看输出结果

2017-08-25 09:38:51.908 JJOC[2525:45235] anObject = How
2017-08-25 09:38:51.909 JJOC[2525:45235] anObject = are
2017-08-25 09:38:51.910 JJOC[2525:45235] anObject = you

结论:这个还是很简单的,这个也不会常用,我们一般用快速遍历。


十一、- (NSEnumerator<ObjectType> *)reverseObjectEnumerator;

该方法的作用:和上面方法作用类似,不过这里是以倒序的方式给出。枚举器对象允许您从数组中的最高索引处的元素到索引0处的元素按顺序访问数组中的每个对象。

还有一点需要注意:

  • 当您使用此方法与NSArray的可变子类时,您不能在枚举期间修改数组。使用快速枚举协议(参见NSFastEnumeration)更为有效。 macOS 10.5及更高版本以及iOS 2.0及更高版本中提供快速枚举。

下面我们看代码

- (void)demoReverseObjectEnumerator
{
    NSArray *arr = @[@"How", @"are", @"you"];
    
    NSEnumerator *enumerator = [arr reverseObjectEnumerator];
    id anObject;
    
    while (anObject = [enumerator nextObject]) {
        NSLog(@"anObject = %@", anObject);
    }
}

下面看输出结果

2017-08-25 09:59:55.155 JJOC[2928:57401] anObject = you
2017-08-25 09:59:55.155 JJOC[2928:57401] anObject = are
2017-08-25 09:59:55.156 JJOC[2928:57401] anObject = How

结论:很简单,可以看看。

后记

未完,待续~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容