在以前的一篇文章中介紹了Foundation框架中的NSString類和NSMutableString類:java
http://blog.csdn.net/jiangwei0910410003/article/details/41788223數組
今天咱們繼續來看一下Foundation框架中的NSArray類和NSMutableArray類,其實NSArray類和Java中的List差很少,算是一種數據結構,固然咱們從這兩個類能夠看到,NSArray類是不可變的,NSMutableArray類是可變的。下面就先來看一下NSArray類xcode
1、NSArray類安全
// // main.m // 16_NSArray // // Created by jiangwei on 14-10-12. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> //NSArray中不能夠存放基本數據類型,只能存放類的實例,若是須要將基本類型、結構體放入到數組中得話, //須要經過NSNumber/NSValue進行數據的封裝,同時不能在NSArray中存儲nil int 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; }下面來看一下他的操做方法:
一、NSArray的建立數據結構
//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);咱們看到他的initWithObjects方法的最後一個值爲nil,這個咱們在以前說到過這個值,他是空指針的意思,和Java中的null同樣的,這裏爲何在建立NSArray的時候最後一個值爲空呢?這個和C語言中的場景是相似的,C語言中字符串的結束符爲'/0',那麼這裏的NSArray的最後一個元素爲nil,緣由是標記NSArray結束了。
而後咱們調用NSLog方法打印NSArray對象,結果:框架
咱們看到了,會打印出很是格式化的數據出來,這個緣由是由於NSLog打印對象的時候會調用其description方法,和Java中的toString方法同樣,固然咱們能夠重寫這個方法的,後面會說到。優化
咱們還可使用類方法建立NSArray:spa
//使用類方法建立 array1 = [NSArray arrayWithObjects:s1,s2,s3, nil]; //建立一個數組,將源數組中的數據拿出來放進去 NSArray *array2 = [NSArray arrayWithArray:array1];
二、使用下標訪問元素.net
//2.----------------------objectAtIndex //訪問數組中的數據,數組中存放的是對象的指針 NSString *str1 = [array1 objectAtIndex:0];
//3.----------------------count //獲取數組元素中的個數 NSUInteger count = [array1 count];//返回的是一個無符號數值NSUInteger是無符號的int類型
四、是否包含某一個元素指針
//4.----------------------containsObject //判斷數組中是否包含某一個對象,判斷的是指針對象值,不是對象中的值 BOOL isContains = [array1 containsObject:@"zhangsan"];
//5.----------------------indexOfObject //返回一個對象在數組中的下標值 NSUInteger index = [array1 indexOfObject:@"zhangsan"]; if(index == NSNotFound){ //沒有找到 }else{ //找到了 }這裏咱們看到用到了一個系統常量:NSNotFound,咱們能夠看到他的定義:
#define NSIntegerMax LONG_MAX看到了,是一個Long類型的最大值。
六、使用指定的鏈接符鏈接數組中全部的元素
//6.----------------------componentsJoinedByString //數組中存放的若是是字符串的話,可使用鏈接符將其全部的元素進行鏈接 //注意數組中的元素必須都是字符串 NSString *content = [array1 componentsJoinedByString:@","];
//8.----------------------arrayByAddingObject //在原來的數組後面追加元素,返回一個新的數組對象,由於他是不可變的 NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];由於NSArray是不可變的,因此會產生一個新的NSArray對象,返回回來
八、數組的遍歷
//數組的遍歷 for(int i=0;i<array1.count;i++){ NSString *str = [array1 objectAtIndex:i]; NSLog(@"%@",str); } //快速遍歷 for(NSString *s in array1){ NSLog(@"%@",s); }第二種方式和Java中的快速遍歷是同樣的。
九、Xcode4.4以後新增了NSArray快速建立的一種方式
//xcode4.4之後,編譯器對數組的建立和訪問語法作了優化 NSArray *array7 = @[s1,s2,s3]; NSString *s = array7[0];這種方式比以前的建立方式又快又方便,並且符合正常的建立方式,訪問的時候也是能夠直接用下標進行獲取元素
2、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.---------------------建立可變數組 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.---------------------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.---------------------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];
這篇文章就介紹了Foundation框架中的NSArray類和NSMutableArray類,他們是用來存放一些指定類型的元素的
注:OC中沒有泛型的概念,因此對於數組中存放了不一樣類型的值,在運行的時候會報錯的,這個和Java相比,操做集合類的時候安全性就差了點。因此咱們在操做集合類的時候須要注意的地方。