OC學習篇之---Foundation架構中的NSArray類和NSMutableArray類,nsarray
在之前的一篇文章中介紹了Foundation架構中的NSString類和NSMutableString類:
http://blog.csdn.net/jiangwei0910410003/article/details/41788223
今天我們繼續來看一下Foundation架構中的NSArray類和NSMutableArray類,其實NSArray類和Java中的List差不多,算是一種資料結構,當然我們從這兩個類可以看到,NSArray類是不可變的,NSMutableArray類是可變的。下面就先來看一下NSArray類
一、NSArray類
//// main.m// 16_NSArray//// Created by jiangwei on 14-10-12.// Copyright (c) 2014年 jiangwei. All rights reserved.//#import <Foundation/Foundation.h>//NSArray中不可以存放基礎資料型別 (Elementary Data Type),只能存放類的執行個體,如果需要將基本類型、結構體放入到數組中得話,//需要通過NSNumber/NSValue進行資料的封裝,同時不能在NSArray中儲存nilint main(int argc, const char * argv[]) { @autoreleasepool { //1.---------------------數組的建立 NSString *s1 = @"zhangsan"; NSString *s2 = @"lisi"; NSString *s3 = @"wangwu"; //最後的nil相當於結束的標記 NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil]; //列印的時候會調用description方法 //相當於:array1.description NSLog(@"%@",array1); //使用類方法建立 array1 = [NSArray arrayWithObjects:s1,s2,s3, nil]; //建立一個數組,將源數組中的資料拿出來放進去 NSArray *array2 = [NSArray arrayWithArray:array1]; //2.----------------------objectAtIndex //訪問數組中的資料,數組中存放的是對象的指標 NSString *str1 = [array1 objectAtIndex:0]; //3.----------------------count //擷取數組元素中的個數 NSUInteger count = [array1 count];//返回的是一個無符號數值 //4.----------------------containsObject //判斷數組中是否包含某一個對象,判斷的是指標對象值,不是對象中的值 BOOL isContains = [array1 containsObject:@"zhangsan"]; //5.----------------------indexOfObject //返回一個對象在數組中的下標值 NSUInteger index = [array1 indexOfObject:@"zhangsan"]; if(index == NSNotFound){ //沒有找到 }else{ //找到了 } //6.----------------------componentsJoinedByString //數組中存放的如果是字串的話,可以使用串連符將其所有的元素進行串連 //注意數組中的元素必須都是字串 NSString *content = [array1 componentsJoinedByString:@","]; //7.----------------------lastObject //訪問數組最後一個元素 NSString *lastObj = [array1 lastObject]; //8.----------------------arrayByAddingObject //在原來的數組後面追加元素,返回一個新的數組對象,因為他是不可變的 NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"]; //數組的遍曆 for(int i=0;i<array1.count;i++){ NSString *str = [array1 objectAtIndex:i]; NSLog(@"%@",str); } //快速遍曆 for(NSString *s in array1){ NSLog(@"%@",s); } //xcode4.4以後,編譯器對數組的建立和訪問文法做了最佳化 NSArray *array7 = @[s1,s2,s3]; NSString *s = array7[0]; } return 0;}下面來看一下他的操作方法:
1、NSArray的建立
//1.---------------------數組的建立NSString *s1 = @"zhangsan";NSString *s2 = @"lisi";NSString *s3 = @"wangwu";//最後的nil相當於結束的標記NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil];//列印的時候會調用description方法//相當於:array1.descriptionNSLog(@"%@",array1);
我們看到他的initWithObjects方法的最後一個值為nil,這個我們在之前說到過這個值,他是null 指標的意思,和Java中的null一樣的,這裡為什麼在建立NSArray的時候最後一個值為空白呢?這個和C語言中的情境是類似的,C語言中字串的結束符為'/0',那麼這裡的NSArray的最後一個元素為nil,原因是標記NSArray結束了。
然後我們調用NSLog方法列印NSArray對象,結果:
我們看到了,會列印出非常格式化的資料出來,這個原因是因為NSLog列印對象的時候會調用其description方法,和Java中的toString方法一樣,當然我們可以重寫這個方法的,後面會說到。
我們還可以使用類方法建立NSArray:
//使用類方法建立array1 = [NSArray arrayWithObjects:s1,s2,s3, nil];//建立一個數組,將源數組中的資料拿出來放進去NSArray *array2 = [NSArray arrayWithArray:array1];
2、使用下標訪問元素
//2.----------------------objectAtIndex//訪問數組中的資料,數組中存放的是對象的指標NSString *str1 = [array1 objectAtIndex:0];
3、擷取數組的大小
//3.----------------------count//擷取數組元素中的個數NSUInteger count = [array1 count];//返回的是一個無符號數值
NSUInteger是無符號的int類型
4、是否包含某一個元素
//4.----------------------containsObject//判斷數組中是否包含某一個對象,判斷的是指標對象值,不是對象中的值BOOL isContains = [array1 containsObject:@"zhangsan"];
5、找到一個元素在數組中的下標
//5.----------------------indexOfObject//返回一個對象在數組中的下標值NSUInteger index = [array1 indexOfObject:@"zhangsan"];if(index == NSNotFound){ //沒有找到}else{ //找到了}這裡我們看到用到了一個系統常量:NSNotFound,我們可以看到他的定義:
#define NSIntegerMax LONG_MAX
看到了,是一個Long類型的最大值。
6、使用指定的串連符串連數組中所有的元素
//6.----------------------componentsJoinedByString//數組中存放的如果是字串的話,可以使用串連符將其所有的元素進行串連//注意數組中的元素必須都是字串NSString *content = [array1 componentsJoinedByString:@","];
7、在數組的尾部增加一個元素
//8.----------------------arrayByAddingObject//在原來的數組後面追加元素,返回一個新的數組對象,因為他是不可變的NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];
因為NSArray是不可變的,所以會產生一個新的NSArray對象,返回回來
8、數組的遍曆
//數組的遍曆for(int i=0;i<array1.count;i++){ NSString *str = [array1 objectAtIndex:i]; NSLog(@"%@",str);}//快速遍曆for(NSString *s in array1){ NSLog(@"%@",s);}第二種方式和Java中的快速遍曆是一樣的。
9、Xcode4.4之後新增了NSArray快速建立的一種方式
//xcode4.4以後,編譯器對數組的建立和訪問文法做了最佳化NSArray *array7 = @[s1,s2,s3];NSString *s = array7[0];
這種方式比之前的建立方式又快又方便,而且符合正常的建立方式,訪問的時候也是可以直接用下標進行擷取元素
二、NSMutableArray類
NSArray類是不可變的,NSMutableArray類是可變的,可變類一樣的特性,就是可以進行增刪改查操作
//// main.m// 17_NSMutableArray//// Created by jiangwei on 14-10-12.// Copyright (c) 2014年 jiangwei. All rights reserved.//#import <Foundation/Foundation.h>//NSMutableArray繼承NSArray類,有NSArray中的所有方法int main(int argc, const char * argv[]) { @autoreleasepool { //1.---------------------建立可變數組 NSString *str1 = @"zhangsan"; NSString *str2 = @"lisi"; NSString *str3 = @"wangwu"; NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil]; //下面的這種方式建立的數組是錯誤的 //下面的這種方式是建立不可變數組的方式,不能喲關於可變數組的建立 //NSMutableArray *array1 = @[str1,str2,str3]; //先開闢5個空間,用於儲存元素,當儲存的元素超過了5個,數組會自動增大空間 NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5]; //使用類方法建立 NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5]; //2.---------------------addObject //添加元素的方法 [mArray1 addObject:str1]; [mArray1 addObject:str2]; //添加數組,把mArray1中的所有元素全部添加到mArray2中 [mArray2 addObjectsFromArray:mArray1]; NSLog(@"mArray3 = %@",mArray2); //二維數組 //這個是將mArray1添加到mArray2數組中,這樣mArray2就變成了二維數組了 [mArray2 addObject:mArray1]; //3.---------------------insertObject //在指定的位置上插入特定元素 [mArray2 insertObject:@"def" atIndex:0]; //4.---------------------replaceObjectAdIdex //替換元素 [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"]; //5.---------------------exchangeObjectAtIndex //互換兩個元素的位置 [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3]; //6.---------------------removeObjectAdIndex //刪除指定位置的元素 [mArray2 removeObjectAtIndex:0]; //刪除最後一個元素 [mArray2 removeLastObject]; //刪除指定的對象 [mArray2 removeObject:@"lisi"]; //刪除所有的對象/清空列表 [mArray2 removeAllObjects]; } return 0;}
1、建立方法
//1.---------------------建立可變數組NSString *str1 = @"zhangsan";NSString *str2 = @"lisi";NSString *str3 = @"wangwu";NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil];//下面的這種方式建立的數組是錯誤的//下面的這種方式是建立不可變數組的方式,不能用於可變數組的建立//NSMutableArray *array1 = @[str1,str2,str3];//先開闢5個空間,用於儲存元素,當儲存的元素超過了5個,數組會自動增大空間NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];//使用類方法建立NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];
建立方式和NSArray類似,但是有一種方式不能用,就是直接建立的方式,那個只能用於建立不變數組。
但是可變數組還有一個方法就是能夠事先的設定數組的大小,而且超過這個大小之後,數組會自動擴充,類似於C語言中的動態數組的實現。
2、添加元素
//2.---------------------addObject//添加元素的方法[mArray1 addObject:str1];[mArray1 addObject:str2];//添加數組,把mArray1中的所有元素全部添加到mArray2中[mArray2 addObjectsFromArray:mArray1];NSLog(@"mArray3 = %@",mArray2); //二維數組//這個是將mArray1添加到mArray2數組中,這樣mArray2就變成了二維數組了[mArray2 addObject:mArray1];NSLog(@"mArray3 = %@",mArray2);
使用addObjectsFromArray方法是將一個數組中的每個元素添加到指定的數組中
使用addObject方法是講一個數組整個都添加到指定的數組中了,那麼這個數組就變成二維數組了
這個兩個方法要區分一下~~
下面是運行結果:
3、在數組的指定位置上插入元素
//3.---------------------insertObject//在指定的位置上插入特定元素[mArray2 insertObject:@"def" atIndex:0];
4、替換元素
//4.---------------------replaceObjectAdIdex//替換元素[mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];
5、互換兩個元素的位置
//5.---------------------exchangeObjectAtIndex//互換兩個元素的位置[mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];
6、刪除方法
//6.---------------------removeObjectAdIndex//刪除指定位置的元素[mArray2 removeObjectAtIndex:0];//刪除最後一個元素[mArray2 removeLastObject];//刪除指定的對象[mArray2 removeObject:@"lisi"];//刪除所有的對象/清空列表[mArray2 removeAllObjects];
總結
這篇文章就介紹了Foundation架構中的NSArray類和NSMutableArray類,他們是用來存放一些指定類型的元素的
註:OC中沒有泛型的概念,所以對於數組中存放了不同類型的值,在啟動並執行時候會報錯的,這個和Java相比,操作集合類的時候安全性就差了點。所以我們在操作集合類的時候需要注意的地方。