標籤:
大綱
NSArray
NSMutableArray
快速枚舉
NSArray
NSArray是一個靜態數組,也就是一個不可變數組,一旦建立以後,就不能進行添加,刪除或者修改其中的元素.NSArray繼承自NSObject,用於管理一系列有序對象的集合,可以通過對象在數組中的位置(索引)來訪問對象.和C語言一樣,數組中元素的索引是從0開始的.數組中既可以用於存放同一個類的對象,也可以用於儲存不同類的對象.但不能存放nil,nil被視為數組結束的標誌,系統會在方法末尾自動產生.
切記:NSArray中只能存放物件類型的資料,不能儲存C語言中的基礎資料型別 (Elementary Data Type),比如int,float等;
NSArray的常用方法
建立
1. 建立一個空數組 init
便利構造器方法 array
NSArray *arr = [[NSArray alloc] init];NSArray *arr0 = [NSArray array];
注意:不可變數組一經建立便不能再修改其內容,但是其數組指標可以改變,可以重指向.空數組建立后里面沒有內容,貌似沒有什麼意義,但它的數組指標可以用於重指向.
2. 自訂建立一個擁有對象的數組 initWithObjects:
NSArray *arr = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", nil];NSLog(@"%@", arr);
便利構造器方法建立數組 arrayWithObjects:
NSArray *arr1 = [NSArray arrayWithObjects:@"d", @"e",@"f", nil];NSLog(@"%@", arr1);
3. 用已有的數組中的對象來初始化並返回一個新的數組 initWithArray:
NSArray *arr3 = [[NSArray alloc] initWithArray:arr];NSLog(@"%@", arr3);
便利構造器方法 arrayWithArray:
NSArray *arr4 = [NSArray arrayWithArray:arr1];NSLog(@"%@", arr4);
4. 訪問
// 返回數組中的元素 countNSUInteger count = arr1.count; // arr1.count 相當於 [arr1 count]NSLog(@"count = %lu", count);// 訪問數組中的第一個元素 firstObjectNSString *firstObject = arr1.firstObject;// 訪問數組中最後一個元素 lastObjectNSString *lastObject = arr1.lastObject;NSLog(@"fistObject = %@ lastObject = %@", firstObject, lastObject);// 根據下標返回數組中元素 objectAtIndex:NSString *str = [arr objectAtIndex:0];NSLog(@"%@", str);
5.排序 sortedArrayUsingSelector: (SEL)comparator
NSArray的排序方法會返回一個新的數組,新數組是對舊數組中的元素經過選取器selector排序後的數組.
NSArray *array = [NSArray arrayWithObjects:@"4", @"1", @"5", @"2", @"3", nil];NSArray *sortArray = [array sortedArrayUsingSelector:@selector(compare:)];NSLog(@"%@", sortArray);
列印結果:
2015-11-29 19:43:36.314 Myself[804:76839] ( 1, 2, 3, 4, 5 )
利用sortedArrayUsingSelector: (SEL)comparator 方法對數組中的對象逐個進行比較,並根據比較的結果產生一個新的數組.
數組對象之間比較的時候使用選取器comparator指定的方法,選取器要求有一個輸入參數,傳回值是NSComparisonResult類型,例如如果要對一個NSString的NSArray進行排序的話,選取器可以使用NSString的方法compare:
NSArray *newArray = [anArray sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray
NSMutableArray 可變數組 ,繼承自NSArray,所以它可以使用NSArray中定義的全部方法.NSMutableArray數組中存放的內容是可以改變的,添加 刪除 替換
建立
可變數組的初始化 initWithCapacity:<#(NSUInteger)#> (NSInteger指定了數組的長度)
便利構造器方法 arrWithCapacity:<#(NSUInteger)#>
NSMutableArray *mArr = [[NSMutableArray alloc] initWithCapacity:0];NSMutableArray *mArr2 = [NSMutableArray arrayWithCapacity:0];
追加
1. 向可變數組中添加元素到數組末尾 addObject:
[mArr addObject:@"HarbingWang"];
2. 將其他數組中的元素全部添加到數組末尾 addObjectsFromArray:
//例如:現有如下數組insertArray,將其添加到上面建立好的空數組mArr2中
NSArray *insertArray = [NSArray arrayWithObjects:@"Manager", @"productDog", @"marketMonkey", @"operationMouse", @"serviceCattle", @"programmingApe", @"designLion", nil];
[mArr2 addObjectsFromArray:insertArray]; NSLog(@"%@", mArr2);
列印結果:
2015-11-29 20:17:21.708 Myself[836:94080] ( Manager, productDog, marketMonkey, operationMouse, serviceCattle, programmingApe, designLion )
3. 添加元素到指定的位置 insertObject: atIndex:
[mArr2 insertObject:@"ziChaoZhe" atIndex:6]; NSLog(@"%@", mArr2);
列印
2015-11-29 20:21:19.615 Myself[879:95624] ( Manager, productDog, marketMonkey, operationMouse, serviceCattle, programmingApe, ziChaoZhe, designLion )
*由列印結果可知:insertObject:是添加anObject到指定的index位置,後面的元素順次後移,index必須在0和數組範圍之間,否則會出出現越界的問題,程式Crash
4. 交換數組中的兩個元素 exchangeObjectAtIndex:<#(NSUInteger)#> withObjectAtIndex:<#(NSUInteger)#>
[mArr2 exchangeObjectAtIndex:0 withObjectAtIndex:1];
5. 刪除
5. 刪除數組中指定位置處的元素 removeObjectAtIndex:[mArr2 removeObjectAtIndex:1];6. 刪除指定的對象 找到了就刪除,找不到就不刪除,原樣輸出 removeObject:[mArr2 removeObject:@"Manager"];7. 刪除最後一個元素 removeLastObject [mArr2 removeLastObject];8. 刪除數組中所有的元素 removeAllObjects
[mArr2 removeAllObjects];
9.排序 sortUsingSelector:
[mArr2 sortUsingSelector:@selector(compare:)];NSLog(@"%@", mArr2);
列印:
2015-11-29 20:51:12.980 Myself[1013:107642] ( designLion, marketMonkey, operationMouse, productDog, programmingApe, serviceCattle, ziChaoZhe )
快速枚舉 forin
OC提供了一個用於遍曆容器類(數組,詞典,集合等)的文法,叫做快速枚舉(fast enumeration),也就是增強型for迴圈,在使用該文法時不需要關心集合中元素的個數, 我們通常將其叫做forin文法.文法如下:
for (<#type *object#> in <#collection#>) {
<#statements#>
}
參數:
<#type *object#> :集合中的物件類型 物件類型的指標變數
<#collection#> :集合對象名
<#statements#> :迴圈體(相應的處理)
好處: OC 提供的快速枚舉(增強型for迴圈),不需要再關心集合中元素的個數
執行步驟: 每一次迴圈把集合的元素取出來賦值給指標變數
尤其值得注意的是: 在快速枚舉過程中,不能修改集合中的元素,因此不要在迴圈體中加入能引起集合發生改變的操作,否則,系統便會拋出異常
遍曆容器中的元素的順序與容器的類型相關.如果是數群組類型,就會從頭開始遍曆,而如果是集合或者詞典,遍曆的順序則與容器的內部實現有關.具體後面將會有所涉及.
for (NSString *string in mArr2) { // [mArr5 removeObject:string]; // 這樣寫系統會報錯: was mutated while being enumerated 快速枚舉的時候修改了集合中的內容,此時就會造成Crash NSLog(@"%@", string);}
列印
2015-11-29 21:01:16.206 Myself[1022:111865] designLion2015-11-29 21:01:16.206 Myself[1022:111865] marketMonkey2015-11-29 21:01:16.220 Myself[1022:111865] operationMouse2015-11-29 21:01:16.220 Myself[1022:111865] productDog2015-11-29 21:01:16.220 Myself[1022:111865] programmingApe2015-11-29 21:01:16.220 Myself[1022:111865] serviceCattle2015-11-29 21:01:16.221 Myself[1022:111865] ziChaoZhe
初學者在使用此文法時,比較困難的是第一個參數<#type *object#>和第二參數<#collection#>如何寫?
在這裡,<#type *object#>是一個變數,由於forin在執行的時候是把要遍曆的集合中的元素依次取出來賦值給這個指標變數,因此這個變數的類型必須與集合中對象的類型保持一致,比如說上例中數組mArr2中的元素都是字串NSString類型的,因此應當搞一個數組型的變數string來接收.如果是Person對象的變數就要搞一個Person*類型的變數來儲存.而<#collection#>則是要遍曆的集合,這個很容易理解.
Objective-C學習篇07—NSArray與NSMutableArray