NSArray簡單細說(六)—— 向數(shù)組中元素發(fā)送消息

版本記錄

版本號 時間
V1.0 2017.08.25

前言

NSArray是集合類型中的一種,是OC中很重要的概念,這個是我們一定會用到的對象,下面我就繼續(xù)由整體到細節(jié)糕殉,由簡單到復(fù)雜的和大家說一下它的用法。感興趣的可以看我寫的上篇幾篇殖告。
1. NSArray簡單細說(一)—— 整體了解
2. NSArray簡單細說(二)—— 數(shù)組的創(chuàng)建
3. NSArray簡單細說(三)—— 數(shù)組初始化
4. NSArray簡單細說(四)—— 數(shù)組的查詢與檢索
5. NSArray簡單細說(五)—— 數(shù)組中對象的查找

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

該方法的作用就是:向數(shù)組中的每個對象發(fā)送由給定選擇器標識的消息,從第一個對象開始黄绩,并通過數(shù)組繼續(xù)到最后一個對象羡洁。

看一下參數(shù),標識要發(fā)送到數(shù)組中的對象的消息的選擇器爽丹。 該方法不能接受任何參數(shù)筑煮,也不能具有修改接收數(shù)組的影響。

如果aSelectorNULL粤蝎,則此方法會引發(fā)NSInvalidArgumentException異常真仲。

下面那我們就看一下一個代碼。

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

上面這個就是示例代碼初澎,作用就是讓數(shù)組中的每一個元素都執(zhí)行floatValue這個方法秸应,這里是運行不通的,因為NSNumber對象并沒有我自定義的floatValue方法。這個方法已經(jīng)廢棄不用的了灸眼。Use enumerateObjectsUsingBlock: or a for loop instead

可以向下面這么使用:將self.view的上的子視圖逐一從父視圖上移除

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

結(jié)論:已經(jīng)不常用了墓懂,看明白即可焰宣。


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

該方法的作用就是:將aSelector消息發(fā)送到數(shù)組中的每個對象捕仔,從第一個對象開始匕积,并通過數(shù)組繼續(xù)到最后一個對象。

下面我們看一下參數(shù):

  • aSelector:標識要發(fā)送到數(shù)組中的對象的消息的選擇器榜跌。 該方法必須使用類型為id的單個參數(shù)闪唆,并且不得具有修改接收數(shù)組的作用。
  • argument:每次調(diào)用aSelector方法钓葫,作為參數(shù)發(fā)送的對象悄蕾。

還有下面幾點需要注意:

  • 如果aSelectorNULL,則此方法會引發(fā)NSInvalidArgumentException異常础浮。

下面還是看代碼

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

這個方法的意思就是用數(shù)組中的每一個元素調(diào)用compare:方法帆调,并且傳入一個參數(shù),我這里傳入的就是@2豆同。

這個方法一樣被廢棄了番刊。

結(jié)論:已經(jīng)不常用了,看明白即可影锈。


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

該方法的作用就是:使用數(shù)組中的每個對象執(zhí)行給定的塊,從第一個對象開始鸭廷,并通過數(shù)組繼續(xù)到最后一個對象枣抱。

下面我們就說一下參數(shù)

  • block
    • obj :數(shù)組中的元素。
    • idx:數(shù)值中元素的索引靴姿。
    • stop:對布爾值的引用沃但。 該塊可以將值設(shè)置為YES以停止對數(shù)組的進一步枚舉。 如果一個程序段停止進一步的枚舉佛吓,該程序段將繼續(xù)運行直到完成宵晚。 停止參數(shù)是一個out-only參數(shù)。 您應(yīng)該只在塊中將此布爾值設(shè)置為YES维雇。

還有幾點需要注意:

  • 如果block參數(shù)為nil淤刃,此方法將引發(fā)異常。 在塊中分配的值將在塊執(zhí)行后被釋放吱型。 使用retain來明確維護這些值逸贾。該方法同步執(zhí)行。

下面看一下代碼

- (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;
        }
    }];
}

下面看輸出結(jié)果

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

結(jié)論:該方法非常非常重要,數(shù)組遍歷的不二選擇铝侵。


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

該方法的作用就是:用數(shù)組中的每一個元素執(zhí)行block塊。

下面我們看一下參數(shù):

  • opts :一個位掩碼咪鲜,指定枚舉的選項(是否應(yīng)同時執(zhí)行狐赡,是否應(yīng)以相反的順序執(zhí)行)。這個值是一個枚舉疟丙,如下所示:
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
    NSEnumerationConcurrent = (1UL << 0),
    NSEnumerationReverse = (1UL << 1),
};
  • stop:對布爾值的引用颖侄。 該塊可以將值設(shè)置為YES以停止對數(shù)組的進一步枚舉。 如果一個程序段停止進一步的枚舉享郊,該程序段將繼續(xù)運行直到完成览祖。 當指定NSEnumerationConcurrent枚舉選項時,所有當前運行的塊完成后炊琉,枚舉停止展蒂。 停止參數(shù)是一個out-only參數(shù)。 您應(yīng)該只在塊中將此布爾值設(shè)置為YES苔咪。

還有幾點需要注意:

  • 默認情況下玄货,枚舉從第一個對象開始,并通過數(shù)組連續(xù)地繼續(xù)到最后一個對象悼泌。 您可以指定NSEnumerationConcurrent和/或NSEnumerationReverse作為枚舉選項來修改此行為松捉。該方法同步執(zhí)行。
  • 如果block參數(shù)為nil馆里,此方法將引發(fā)異常隘世。

下面我們就看一下代碼

- (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

結(jié)論:該方法仍然非常重要,需要理解熟記鸠踪。


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

該方法的作用就是:使用指定索引的數(shù)組中的對象執(zhí)行給定的塊。

下面我們看一下參數(shù):

  • s:要枚舉的對象的索引营密。
  • optsblock的參數(shù)就不多說了械媒,以前已經(jīng)寫的很清楚了。

這里還要注意:

  • 默認情況下评汰,枚舉從第一個對象開始纷捞,并且通過數(shù)組連續(xù)地繼續(xù)到由indexSet指定的最后一個元素。 您可以指定NSEnumerationConcurrent和/或NSEnumerationReverse作為枚舉選項來修改此行為被去,該方法同步執(zhí)行主儡。
  • 如果block參數(shù)或indexSet為nil,此方法將引發(fā)異常惨缆。

下面我們看代碼

- (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;
        }
    }];
}

下面看輸出結(jié)果

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

結(jié)論:這個也值得一看的糜值。

后記

未完丰捷,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寂汇,隨后出現(xiàn)的幾起案子病往,更是在濱河造成了極大的恐慌,老刑警劉巖骄瓣,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荣恐,死亡現(xiàn)場離奇詭異,居然都是意外死亡累贤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門少漆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臼膏,“玉大人,你說我怎么就攤上這事示损∩酰” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵检访,是天一觀的道長始鱼。 經(jīng)常有香客問我,道長脆贵,這世上最難降的妖魔是什么医清? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮卖氨,結(jié)果婚禮上会烙,老公的妹妹穿的比我還像新娘。我一直安慰自己筒捺,他們只是感情好柏腻,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著系吭,像睡著了一般五嫂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肯尺,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天沃缘,我揣著相機與錄音,去河邊找鬼则吟。 笑死孩灯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逾滥。 我是一名探鬼主播峰档,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼败匹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了讥巡?” 一聲冷哼從身側(cè)響起掀亩,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欢顷,沒想到半個月后槽棍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡抬驴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年炼七,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片布持。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡豌拙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出题暖,到底是詐尸還是另有隱情按傅,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布胧卤,位于F島的核電站唯绍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏枝誊。R本人自食惡果不足惜况芒,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叶撒。 院中可真熱鬧牛柒,春花似錦、人聲如沸痊乾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哪审。三九已至蛾魄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湿滓,已是汗流浹背滴须。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叽奥,地道東北人扔水。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像朝氓,于是被迫代替她去往敵國和親魔市。 傳聞我的和親對象是個殘疾皇子主届,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容