OC學習篇之---Foundation架構中的NSArray類和NSMutableArray類,nsarray

來源:互聯網
上載者:User

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相比,操作集合類的時候安全性就差了點。所以我們在操作集合類的時候需要注意的地方。













聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.