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

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

后记

未完,待续~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容