版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.08.24 |
前言
NSArray
是集合類型中的一種颠焦,是OC中很重要的概念卒废,這個是我們一定會用到的對象,下面我就繼續(xù)由整體到細節(jié)系馆,由簡單到復雜的和大家說一下它的用法。感興趣的可以看我寫的上篇幾篇顽照。
1. NSArray簡單細說(一)—— 整體了解
2. NSArray簡單細說(二)—— 數(shù)組的創(chuàng)建
3. NSArray簡單細說(三)—— 數(shù)組初始化
一由蘑、- (BOOL)containsObject:(ObjectType)anObject;
該方法的作用是:判斷給定的對象是否在數(shù)組中。
還有幾點需要注意:
- 從索引0開始代兵,數(shù)組的每個元素作為參數(shù)傳遞給發(fā)送到aObject的
isEqual
:纵穿,直到找到匹配或達到數(shù)組的結(jié)尾。 如果isEqual :
(在NSObject協(xié)議中聲明)返回YES奢人,則對象被認為是相等的谓媒。
下面我們看一下代碼
- (void)demoContainsObject
{
NSArray *arr = @[@"How", @"are", @"you"];
if ([arr containsObject:@"are"]) {
NSLog(@"It is in the arr");
}
else {
NSLog(@"It is not in the arr");
}
}
下面看輸出結(jié)果
2017-08-25 08:55:48.918 JJOC[1190:18461] It is in the arr
結(jié)論:很簡單,掃一眼就可以了何乎。
二句惯、@property(readonly) NSUInteger count;
該屬性的作用就是:獲取數(shù)組中元素的個數(shù),這個很有用支救,特別是在判斷數(shù)組越界還有遍歷的時候都是經(jīng)常用到的抢野。
結(jié)論:很簡單,掃一眼就可以了各墨。
三指孤、- (void)getObjects:(ObjectType _Nonnull [])objects;
該方法的作用就是:將數(shù)組中包含的所有對象復制到aBuffer
。
還要幾點需要注意:
- 這種廢棄使用的方法是不安全的,因為它可能會導致緩沖區(qū)溢出恃轩。
- 該方法將復制到緩沖區(qū)中的所有對象中; 因此结洼,緩沖區(qū)的大小必須至少與數(shù)組的計數(shù)乘以對象引用的大小,如以下示例所示(請注意叉跛,這僅僅是一個示例松忍,您通常不應(yīng)該創(chuàng)建一個緩沖區(qū)來簡單地迭代 數(shù)組的內(nèi)容)。
NSArray *mArray = // ...;
id *objects;
NSUInteger count = [mArray count];
objects = malloc(sizeof(id) * count);
[mArray getObjects:objects];
for (i = 0; i < count; i++) {
NSLog(@"object at index %d: %@", i, objects[i]);
}
free(objects);
結(jié)論:看看就可以了筷厘,用的很少鸣峭,而且已經(jīng)被廢棄了。
四酥艳、- (void)getObjects:(ObjectType _Nonnull [])objects range:(NSRange)range;
該方法的作用就是:將包含在指定范圍內(nèi)的數(shù)組中的對象復制到aBuffer
摊溶。
下面我們看一下參數(shù):
- 尺寸至少為
aRange
指定范圍長度的C數(shù)組對象。 - 數(shù)組范圍內(nèi)的范圍充石。如果位置加上范圍的長度大于數(shù)組的長度更扁,則此方法會引發(fā)
NSRangeException
。
還有幾點需要注意:
- 該方法將在aRange指定的范圍內(nèi)復制到緩沖區(qū)中的數(shù)組中的對象; 因此赫冬,緩沖區(qū)的大小必須至少為范圍的長度乘以對象引用的大小浓镜,如以下示例所示(這僅僅是為了說明 - 您通常不應(yīng)該創(chuàng)建一個緩沖區(qū)來簡單地迭代內(nèi)容 的數(shù)組)。
NSArray *mArray = // an array with at least six elements...;
id *objects;
NSRange range = NSMakeRange(2, 4);
objects = malloc(sizeof(id) * range.length);
[mArray getObjects:objects range:range];
for (i = 0; i < range.length; i++) {
NSLog(@"objects: %@", objects[i]);
}
free(objects);
結(jié)論:這個用的少劲厌,看看就可以膛薛。
五、@property(nonatomic, readonly) ObjectType firstObject;
該屬性的作用就是:獲取數(shù)組中的第一個元素补鼻,其實就是腳標為0的元素哄啄,如果數(shù)組為空那么就會返回nil。
結(jié)論:很常用风范,很簡單咨跌。
六、@property(nonatomic, readonly) ObjectType lastObject;
該屬性的作用就是:獲取數(shù)組中的最后一個元素硼婿,其實就是腳標為count - 1
的元素锌半,如果數(shù)組為空那么就會返回nil。
結(jié)論:很常用寇漫,很簡單刊殉。
七、- (ObjectType)objectAtIndex:(NSUInteger)index;
該方法的作用就是:獲取指定腳標對應(yīng)的元素州胳。
這里還要注意:如果index超出了數(shù)組的結(jié)尾(也就是說记焊,如果index大于或等于count返回的值),則引發(fā)NSRangeException
栓撞。
下面看代碼
- (void)demoObjectAtIndex
{
NSArray *arr = @[@"How", @"are", @"you"];
NSString *obj = [arr objectAtIndex:0];
NSLog(@"obj = %@", obj);
}
下面看輸出結(jié)果
2017-08-25 09:19:01.267 JJOC[1819:32852] obj = How
結(jié)論:很常用遍膜,很簡單碗硬。
八、 (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx;
該方法的作用就是:獲取數(shù)組中指定索引對應(yīng)的對象瓢颅。
還有幾點需要注意:
- 該方法與
objectAtIndex:
方法具有相同的行為恩尾。如果index超出了數(shù)組的結(jié)尾(也就是說,如果index大于或等于count返回的值)惜索,則引發(fā)NSRangeException
。您不應(yīng)該直接調(diào)用此方法剃浇。 而是使用下標通過索引訪問對象時調(diào)用此方法巾兆。
id value = array[3]; // equivalent to [array objectAtIndex:3]
結(jié)論:很簡單,并不常用虎囚。
九角塑、- (NSArray<ObjectType> *)objectsAtIndexes:(NSIndexSet *)indexes;
該方法的作用就是:返回一個數(shù)組,它包含數(shù)組中由給定索引集指定的索引的對象淘讥。
還有幾點需要注意:
- 返回的對象按索引中的索引的升序排列圃伶,因此索引中索引較高的返回數(shù)組中的對象將跟隨索引中索引較小的對象。如果索引中的任何位置超出了數(shù)組的邊界蒲列,則引發(fā)
NSRangeException
窒朋,索引為nil。
下面我們看代碼
- (void)demoObjectsAtIndexes
{
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)];
NSArray *arr = @[@"How", @"are", @"you"];
NSArray *resultArr = [arr objectsAtIndexes:set];
NSLog(@"resultArr = %@", resultArr);
}
下面看輸出結(jié)果
2017-08-25 09:29:34.482 JJOC[2190:39175] resultArr = (
How,
are
)
結(jié)論:有時候也會用到蝗岖,很簡單侥猩,可以看看。
十抵赢、- (NSEnumerator<ObjectType> *)objectEnumerator;
該方法的作用就是:返回一個枚舉器對象欺劳,允許您訪問數(shù)組中的每個對象。返回值是一個枚舉器對象铅鲤,允許您按順序從最低索引的元素向上訪問數(shù)組中的每個對象划提。
還要幾點需要注意:
- 當您使用此方法與NSArray的可變子類時,您不能在枚舉期間修改數(shù)組邢享。使用快速枚舉協(xié)議(參見
NSFastEnumeration
)更為有效鹏往。 macOS 10.5及更高版本以及iOS 2.0及更高版本中提供快速枚舉。
下面看一下代碼
- (void)demoObjectEnumerator
{
NSArray *arr = @[@"How", @"are", @"you"];
NSEnumerator *enumerator = [arr objectEnumerator];
id anObject;
while (anObject = [enumerator nextObject]) {
NSLog(@"anObject = %@", anObject);
}
}
下面看輸出結(jié)果
2017-08-25 09:38:51.908 JJOC[2525:45235] anObject = How
2017-08-25 09:38:51.909 JJOC[2525:45235] anObject = are
2017-08-25 09:38:51.910 JJOC[2525:45235] anObject = you
結(jié)論:這個還是很簡單的骇塘,這個也不會常用掸犬,我們一般用快速遍歷。
十一绪爸、- (NSEnumerator<ObjectType> *)reverseObjectEnumerator;
該方法的作用:和上面方法作用類似湾碎,不過這里是以倒序的方式給出。枚舉器對象允許您從數(shù)組中的最高索引處的元素到索引0處的元素按順序訪問數(shù)組中的每個對象奠货。
還有一點需要注意:
- 當您使用此方法與NSArray的可變子類時介褥,您不能在枚舉期間修改數(shù)組。使用快速枚舉協(xié)議(參見
NSFastEnumeration
)更為有效。 macOS 10.5及更高版本以及iOS 2.0及更高版本中提供快速枚舉柔滔。
下面我們看代碼
- (void)demoReverseObjectEnumerator
{
NSArray *arr = @[@"How", @"are", @"you"];
NSEnumerator *enumerator = [arr reverseObjectEnumerator];
id anObject;
while (anObject = [enumerator nextObject]) {
NSLog(@"anObject = %@", anObject);
}
}
下面看輸出結(jié)果
2017-08-25 09:59:55.155 JJOC[2928:57401] anObject = you
2017-08-25 09:59:55.155 JJOC[2928:57401] anObject = are
2017-08-25 09:59:55.156 JJOC[2928:57401] anObject = How
結(jié)論:很簡單溢陪,可以看看。
后記
未完睛廊,待續(xù)~~