版本記錄
版本號 | 時間 |
---|---|
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ù)組的影響。
如果aSelector
為NULL
粤蝎,則此方法會引發(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ā)送的對象悄蕾。
還有下面幾點需要注意:
- 如果
aSelector
為NULL
,則此方法會引發(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
:要枚舉的對象的索引营密。 -
opts
和block
的參數(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ù)~~~