天天看點

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象

------ Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------

一、NSArray類

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //  
  2. //  main.m  
  3. //  16_NSArray  
  4. //  
  5. //  Created by jiangwei on 14-10-12.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8. #import <Foundation/Foundation.h>  
  9. //NSArray中不可以存放基本資料類型,隻能存放類的執行個體,如果需要将基本類型、結構體放入到數組中得話,  
  10. //需要通過NSNumber/NSValue進行資料的封裝,同時不能在NSArray中存儲nil  
  11. int main(int argc, const charchar * argv[]) {  
  12.     @autoreleasepool {  
  13.         //1.---------------------數組的建立  
  14.         NSString *s1 = @"zhangsan";  
  15.         NSString *s2 = @"lisi";  
  16.         NSString *s3 = @"wangwu";  
  17.         //最後的nil相當于結束的标記  
  18.         NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil];  
  19.         //列印的時候會調用description方法  
  20.         //相當于:array1.description  
  21.         NSLog(@"%@",array1);  
  22.         //使用類方法建立  
  23.         array1 = [NSArray arrayWithObjects:s1,s2,s3, nil nil];  
  24.         //建立一個數組,将源數組中的資料拿出來放進去  
  25.         NSArray *array2 = [NSArray arrayWithArray:array1];  
  26.         //2.----------------------objectAtIndex  
  27.         //通路數組中的資料,數組中存放的是對象的指針  
  28.         NSString *str1 = [array1 objectAtIndex:0];  
  29.         //3.----------------------count  
  30.         //擷取數組元素中的個數  
  31.         NSUInteger count = [array1 count];//傳回的是一個無符号數值  
  32.         //4.----------------------containsObject  
  33.         //判斷數組中是否包含某一個對象,判斷的是指針對象值,不是對象中的值  
  34.         BOOL isContains = [array1 containsObject:@"zhangsan"];  
  35.         //5.----------------------indexOfObject  
  36.         //傳回一個對象在數組中的下标值  
  37.         NSUInteger index = [array1 indexOfObject:@"zhangsan"];  
  38.         if(index == NSNotFound){  
  39.             //沒有找到  
  40.         }else{  
  41.             //找到了  
  42.         }  
  43.         //6.----------------------componentsJoinedByString  
  44.         //數組中存放的如果是字元串的話,可以使用連接配接符将其所有的元素進行連接配接  
  45.         //注意數組中的元素必須都是字元串  
  46.         NSString *content = [array1 componentsJoinedByString:@","];  
  47.         //7.----------------------lastObject  
  48.         //通路數組最後一個元素  
  49.         NSString *lastObj = [array1 lastObject];  
  50.         //8.----------------------arrayByAddingObject  
  51.         //在原來的數組後面追加元素,傳回一個新的數組對象,因為他是不可變的  
  52.         NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];  
  53.         //數組的周遊  
  54.         for(int i=0;i<array1.count;i++){  
  55.             NSString *str = [array1 objectAtIndex:i];  
  56.             NSLog(@"%@",str);  
  57.         }  
  58.         //快速周遊  
  59.         for(NSString *s in array1){  
  60.             NSLog(@"%@",s);  
  61.         }  
  62.         //xcode4.4以後,編譯器對數組的建立和通路文法做了優化  
  63.         NSArray *array7 = @[s1,s2,s3];  
  64.         NSString *s = array7[0];  
  65.     }  
  66.     return 0;  
  67. }  

下面來看一下他的操作方法:

1、NSArray的建立

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //1.---------------------數組的建立  
  2. NSString *s1 = @"zhangsan";  
  3. NSString *s2 = @"lisi";  
  4. NSString *s3 = @"wangwu";  
  5. //最後的nil相當于結束的标記  
  6. NSArray *array1 = [[NSArray alloc] initWithObjects:s1,s2,s3, nil nil];  
  7. //列印的時候會調用description方法  
  8. //相當于:array1.description  
  9. NSLog(@"%@",array1);  

我們看到他的initWithObjects方法的最後一個值為nil,這個我們在之前說到過這個值,他是空指針的意思,和Java中的null一樣的,這裡為什麼在建立NSArray的時候最後一個值為空呢?這個和C語言中的場景是類似的,C語言中字元串的結束符為'/0',那麼這裡的NSArray的最後一個元素為nil,原因是标記NSArray結束了。

然後我們調用NSLog方法列印NSArray對象,結果:

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象

我們看到了,會列印出非常格式化的資料出來,這個原因是因為NSLog列印對象的時候會調用其description方法,和Java中的toString方法一樣,當然我們可以重寫這個方法的,後面會說到。

我們還可以使用類方法建立NSArray:

[java]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //使用類方法建立  
  2. array1 = [NSArray arrayWithObjects:s1,s2,s3, nil];  
  3. //建立一個數組,将源數組中的資料拿出來放進去  
  4. NSArray *array2 = [NSArray arrayWithArray:array1];  

2、使用下标通路元素

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //2.----------------------objectAtIndex  
  2. //通路數組中的資料,數組中存放的是對象的指針  
  3. NSString *str1 = [array1 objectAtIndex:0];  

3、擷取數組的大小

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //3.----------------------count  
  2. //擷取數組元素中的個數  
  3. NSUInteger count = [array1 count];//傳回的是一個無符号數值  

NSUInteger是無符号的int類型

4、是否包含某一個元素

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //4.----------------------containsObject  
  2. //判斷數組中是否包含某一個對象,判斷的是指針對象值,不是對象中的值  
  3. BOOL isContains = [array1 containsObject:@"zhangsan"];  

5、找到一個元素在數組中的下标

[java]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //5.----------------------indexOfObject  
  2. //傳回一個對象在數組中的下标值  
  3. NSUInteger index = [array1 indexOfObject:@"zhangsan"];  
  4. if(index == NSNotFound){  
  5.     //沒有找到  
  6. }else{  
  7.     //找到了  
  8. }  

這裡我們看到用到了一個系統常量:NSNotFound,我們可以看到他的定義:

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. #define NSIntegerMax    LONG_MAX  

看到了,是一個Long類型的最大值。

6、使用指定的連接配接符連接配接數組中所有的元素

[java]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //6.----------------------componentsJoinedByString  
  2. //數組中存放的如果是字元串的話,可以使用連接配接符将其所有的元素進行連接配接  
  3. //注意數組中的元素必須都是字元串  
  4. NSString *content = [array1 componentsJoinedByString:@","];  

7、在數組的尾部增加一個元素

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //8.----------------------arrayByAddingObject  
  2. //在原來的數組後面追加元素,傳回一個新的數組對象,因為他是不可變的  
  3. NSArray *array3 = [array1 arrayByAddingObject:@"zhaoliu"];  

因為NSArray是不可變的,是以會産生一個新的NSArray對象,傳回回來

8、數組的周遊

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //數組的周遊  
  2. for(int i=0;i<array1.count;i++){  
  3.     NSString *str = [array1 objectAtIndex:i];  
  4.     NSLog(@"%@",str);  
  5. }  
  6. //快速周遊  
  7. for(NSString *s in array1){  
  8.     NSLog(@"%@",s);  
  9. }  

第二種方式和Java中的快速周遊是一樣的。

9、Xcode4.4之後新增了NSArray快速建立的一種方式

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //xcode4.4以後,編譯器對數組的建立和通路文法做了優化  
  2. NSArray *array7 = @[s1,s2,s3];  
  3. NSString *s = array7[0];  

這種方式比之前的建立方式又快又友善,而且符合正常的建立方式,通路的時候也是可以直接用下标進行擷取元素

二、NSMutableArray類

NSArray類是不可變的,NSMutableArray類是可變的,可變類一樣的特性,就是可以進行增删改查操作

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //  
  2. //  main.m  
  3. //  17_NSMutableArray  
  4. //  
  5. //  Created by jiangwei on 14-10-12.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8. #import <Foundation/Foundation.h>  
  9. //NSMutableArray繼承NSArray類,有NSArray中的所有方法  
  10. int main(int argc, const charchar * argv[]) {  
  11.     @autoreleasepool {  
  12.         //1.---------------------建立可變數組  
  13.         NSString *str1 = @"zhangsan";  
  14.         NSString *str2 = @"lisi";  
  15.         NSString *str3 = @"wangwu";  
  16.         NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil nil];  
  17.         //下面的這種方式建立的數組是錯誤的  
  18.         //下面的這種方式是建立不可變數組的方式,不能喲關于可變數組的建立  
  19.         //NSMutableArray *array1 = @[str1,str2,str3];  
  20.         //先開辟5個空間,用于存儲元素,當存儲的元素超過了5個,數組會自動增大空間  
  21.         NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];  
  22.         //使用類方法建立  
  23.         NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];  
  24.         //2.---------------------addObject  
  25.         //添加元素的方法  
  26.         [mArray1 addObject:str1];  
  27.         [mArray1 addObject:str2];  
  28.         //添加數組,把mArray1中的所有元素全部添加到mArray2中  
  29.         [mArray2 addObjectsFromArray:mArray1];  
  30.         NSLog(@"mArray3 = %@",mArray2);  
  31.         //二維數組  
  32.         //這個是将mArray1添加到mArray2數組中,這樣mArray2就變成了二維數組了  
  33.         [mArray2 addObject:mArray1];  
  34.         //3.---------------------insertObject  
  35.         //在指定的位置上插入特定元素  
  36.         [mArray2 insertObject:@"def" atIndex:0];  
  37.         //4.---------------------replaceObjectAdIdex  
  38.         //替換元素  
  39.         [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];  
  40.         //5.---------------------exchangeObjectAtIndex  
  41.         //互換兩個元素的位置  
  42.         [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];  
  43.         //6.---------------------removeObjectAdIndex  
  44.         //删除指定位置的元素  
  45.         [mArray2 removeObjectAtIndex:0];  
  46.         //删除最後一個元素  
  47.         [mArray2 removeLastObject];  
  48.         //删除指定的對象  
  49.         [mArray2 removeObject:@"lisi"];  
  50.         //删除所有的對象/清空清單  
  51.         [mArray2 removeAllObjects];  
  52.     }  
  53.     return 0;  
  54. }  

1、建立方法

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //1.---------------------建立可變數組  
  2. NSString *str1 = @"zhangsan";  
  3. NSString *str2 = @"lisi";  
  4. NSString *str3 = @"wangwu";  
  5. NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithObjects:str1,str2,str3, nil nil];  
  6. //下面的這種方式建立的數組是錯誤的  
  7. //下面的這種方式是建立不可變數組的方式,不能用于可變數組的建立  
  8. //NSMutableArray *array1 = @[str1,str2,str3];  
  9. //先開辟5個空間,用于存儲元素,當存儲的元素超過了5個,數組會自動增大空間  
  10. NSMutableArray *mArray2 = [[NSMutableArray alloc] initWithCapacity:5];  
  11. //使用類方法建立  
  12. NSMutableArray *mArray3 = [NSMutableArray arrayWithCapacity:5];  

建立方式和NSArray類似,但是有一種方式不能用,就是直接建立的方式,那個隻能用于建立不變數組。

但是可變數組還有一個方法就是能夠事先的設定數組的大小,而且超過這個大小之後,數組會自動擴充,類似于C語言中的動态數組的實作。

2、添加元素

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //2.---------------------addObject  
  2. //添加元素的方法  
  3. [mArray1 addObject:str1];  
  4. [mArray1 addObject:str2];  
  5. //添加數組,把mArray1中的所有元素全部添加到mArray2中  
  6. [mArray2 addObjectsFromArray:mArray1];  
  7. NSLog(@"mArray3 = %@",mArray2);  
  8. //二維數組  
  9. //這個是将mArray1添加到mArray2數組中,這樣mArray2就變成了二維數組了  
  10. [mArray2 addObject:mArray1];  
  11. NSLog(@"mArray3 = %@",mArray2);  

使用addObjectsFromArray方法是将一個數組中的每個元素添加到指定的數組中

使用addObject方法是講一個數組整個都添加到指定的數組中了,那麼這個數組就變成二維數組了

這個兩個方法要區分一下~~

下面是運作結果:

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象

3、在數組的指定位置上插入元素

[java]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //3.---------------------insertObject  
  2. //在指定的位置上插入特定元素  
  3. [mArray2 insertObject:@"def" atIndex:0];  

4、替換元素

[java]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //4.---------------------replaceObjectAdIdex  
  2. //替換元素  
  3. [mArray2 replaceObjectAtIndex:0 withObject:@"aaa"];  

5、互換兩個元素的位置

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //5.---------------------exchangeObjectAtIndex  
  2. //互換兩個元素的位置  
  3. [mArray2 exchangeObjectAtIndex:0 withObjectAtIndex:3];  

6、删除方法

[objc]  view plain copy

黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
黑馬程式員--OC學習篇之Foundation架構中的NSArray對象和NSMutableArray對象
  1. //6.---------------------removeObjectAdIndex  
  2. //删除指定位置的元素  
  3. [mArray2 removeObjectAtIndex:0];  
  4. //删除最後一個元素  
  5. [mArray2 removeLastObject];  
  6. //删除指定的對象  
  7. [mArray2 removeObject:@"lisi"];  
  8. //删除所有的對象/清空清單  
  9. [mArray2 removeAllObjects];