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閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容