版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.08.25 |
前言
NSArray
是集合類型中的一種,是OC中很重要的概念,這個是我們一定會用到的對象,下面我就繼續由整體到細節,由簡單到復雜的和大家說一下它的用法。感興趣的可以看我寫的上篇幾篇。
1. NSArray簡單細說(一)—— 整體了解
2. NSArray簡單細說(二)—— 數組的創建
3. NSArray簡單細說(三)—— 數組初始化
4. NSArray簡單細說(四)—— 數組的查詢與檢索
5. NSArray簡單細說(五)—— 數組中對象的查找
一、- (void)makeObjectsPerformSelector:(SEL)aSelector;
該方法的作用就是:向數組中的每個對象發送由給定選擇器標識的消息,從第一個對象開始,并通過數組繼續到最后一個對象。
看一下參數,標識要發送到數組中的對象的消息的選擇器。 該方法不能接受任何參數,也不能具有修改接收數組的影響。
如果aSelector
為NULL
,則此方法會引發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方法,作為參數發送的對象。
還有下面幾點需要注意:
- 如果
aSelector
為NULL
,則此方法會引發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
:要枚舉的對象的索引。 -
opts
和block
的參數就不多說了,以前已經寫的很清楚了。
這里還要注意:
- 默認情況下,枚舉從第一個對象開始,并且通過數組連續地繼續到由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
結論:這個也值得一看的。
后記
未完,待續~~~