OC學習篇之---Foundation框架中的NSArray類和NSMutableArray類 分類: IOS 2014-12-08 22:10 2981人閱讀 評論(0) 收藏

在以前的一篇文章中介紹了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相比,操做集合類的時候安全性就差了點。因此咱們在操做集合類的時候須要注意的地方。

相關文章
相關標籤/搜索