NSArray简单细说(六)—— 向数组中元素发送消息

版本记录

版本号 时间
V1.0 2017.08.25

前言

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

一、- (void)makeObjectsPerformSelector:(SEL)aSelector;

该方法的作用就是:向数组中的每个对象发送由给定选择器标识的消息,从第一个对象开始,并通过数组继续到最后一个对象。

看一下参数,标识要发送到数组中的对象的消息的选择器。 该方法不能接受任何参数,也不能具有修改接收数组的影响。

如果aSelectorNULL,则此方法会引发NSInvalidArgumentException异常。

下面那我们就看一下一个代码。

- (void)demoMakeObjectsPerformSelector
{
    NSArray *arr = @[@1, @2, @3];
    
    [arr makeObjectsPerformSelector:@selector(floatValue)];
}

上面这个就是示例代码,作用就是让数组中的每一个元素都执行floatValue这个方法,这里是运行不通的,因为NSNumber对象并没有我自定义的floatValue方法。这个方法已经废弃不用的了。Use enumerateObjectsUsingBlock: or a for loop instead

可以向下面这么使用:将self.view的上的子视图逐一从父视图上移除

[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

结论:已经不常用了,看明白即可。


二、- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;

该方法的作用就是:将aSelector消息发送到数组中的每个对象,从第一个对象开始,并通过数组继续到最后一个对象。

下面我们看一下参数:

  • aSelector:标识要发送到数组中的对象的消息的选择器。 该方法必须使用类型为id的单个参数,并且不得具有修改接收数组的作用。
  • argument:每次调用aSelector方法,作为参数发送的对象。

还有下面几点需要注意:

  • 如果aSelectorNULL,则此方法会引发NSInvalidArgumentException异常。

下面还是看代码

- (void)demoMakeObjectsPerformSelectorWithObject
{
    NSArray *arr = @[@1, @2, @3];
    
    [arr makeObjectsPerformSelector:@selector(compare:) withObject:@2];
}

这个方法的意思就是用数组中的每一个元素调用compare:方法,并且传入一个参数,我这里传入的就是@2。

这个方法一样被废弃了。

结论:已经不常用了,看明白即可。


三、- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;

该方法的作用就是:使用数组中的每个对象执行给定的块,从第一个对象开始,并通过数组继续到最后一个对象。

下面我们就说一下参数

  • block
    • obj :数组中的元素。
    • idx:数值中元素的索引。
    • stop:对布尔值的引用。 该块可以将值设置为YES以停止对数组的进一步枚举。 如果一个程序段停止进一步的枚举,该程序段将继续运行直到完成。 停止参数是一个out-only参数。 您应该只在块中将此布尔值设置为YES。

还有几点需要注意:

  • 如果block参数为nil,此方法将引发异常。 在块中分配的值将在块执行后被释放。 使用retain来明确维护这些值。该方法同步执行。

下面看一下代码

- (void)demoEnumerateObjectsUsingBlock
{
    NSArray *arr = @[@1, @2, @3];
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        NSLog(@"obj = %@", obj);

        if ([obj integerValue] == 2) {
            *stop = YES;
        }
    }];
}

下面看输出结果

2017-08-25 17:05:10.878 JJOC[2391:37858] obj = 1
2017-08-25 17:05:10.878 JJOC[2391:37858] obj = 2

结论:该方法非常非常重要,数组遍历的不二选择。


四、- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;

该方法的作用就是:用数组中的每一个元素执行block块。

下面我们看一下参数:

  • opts :一个位掩码,指定枚举的选项(是否应同时执行,是否应以相反的顺序执行)。这个值是一个枚举,如下所示:
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
    NSEnumerationConcurrent = (1UL << 0),
    NSEnumerationReverse = (1UL << 1),
};
  • stop:对布尔值的引用。 该块可以将值设置为YES以停止对数组的进一步枚举。 如果一个程序段停止进一步的枚举,该程序段将继续运行直到完成。 当指定NSEnumerationConcurrent枚举选项时,所有当前运行的块完成后,枚举停止。 停止参数是一个out-only参数。 您应该只在块中将此布尔值设置为YES。

还有几点需要注意:

  • 默认情况下,枚举从第一个对象开始,并通过数组连续地继续到最后一个对象。 您可以指定NSEnumerationConcurrent和/或NSEnumerationReverse作为枚举选项来修改此行为。该方法同步执行。
  • 如果block参数为nil,此方法将引发异常。

下面我们就看一下代码

- (void)demoEnumerateObjectsWithOptions
{
    NSArray *arr = @[@1, @2, @3];
    [arr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"obj = %@", obj);
        
        if ([obj integerValue] == 2) {
            *stop = YES;
        }
    }];
}

下面看输出

2017-08-25 17:12:59.043 JJOC[2625:45174] obj = 3
2017-08-25 17:12:59.043 JJOC[2625:45174] obj = 2

结论:该方法仍然非常重要,需要理解熟记。


五、- (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;

该方法的作用就是:使用指定索引的数组中的对象执行给定的块。

下面我们看一下参数:

  • s:要枚举的对象的索引。
  • optsblock的参数就不多说了,以前已经写的很清楚了。

这里还要注意:

  • 默认情况下,枚举从第一个对象开始,并且通过数组连续地继续到由indexSet指定的最后一个元素。 您可以指定NSEnumerationConcurrent和/或NSEnumerationReverse作为枚举选项来修改此行为,该方法同步执行。
  • 如果block参数或indexSet为nil,此方法将引发异常。

下面我们看代码

- (void)demoEnumerateObjectsAtIndexes
{
    NSArray *arr = @[@1, @2, @3];
    NSIndexSet *set  = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)];
    [arr enumerateObjectsAtIndexes:set options:NSEnumerationConcurrent usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"obj = %@", obj);
        
        if ([obj integerValue] == 2) {
            *stop = YES;
        }
    }];
}

下面看输出结果

2017-08-25 17:36:17.119 JJOC[3131:61583] obj = 1
2017-08-25 17:36:17.119 JJOC[3131:61583] obj = 2

结论:这个也值得一看的。

后记

未完,待续~~~

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

推荐阅读更多精彩内容