1. 程式人生 > >OC學習篇之---Foundation框架中的NSArray類和NSMutableArray類

OC學習篇之---Foundation框架中的NSArray類和NSMutableArray類

在之前的一篇文章中介紹了Foundation框架中的NSString類和NSMutableString類:

今天我們繼續來看一下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中不可以存放基本資料型別,只能存放類的例項,如果需要將基本型別、結構體放入到陣列中得話,
//需要通過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;
}
下面來看一下他的操作方法:

1、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:

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


相關推薦

OC學習---Foundation框架NSArrayNSMutableArray

在之前的一篇文章中介紹了Foundation框架中的NSString類和NSMutableString類:今天我們繼續來看一下Foundation框架中的NSArray類和NSMutableArray類,其實NSArray類和Java中的List差不多,算是一種資料結構,當然

OC學習--- property synthesize的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OC學習---謂詞 NSPredicate

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OC學習---的三大特性 封裝,繼承,多型

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OC學習---檔案的操作

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OC學習---協議的概念用法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OC學習---的初始化方法點語法的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OC學習---通知 NSNotificationCenter

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OC學習---歸檔和解擋

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OC學習---KVCKVO操作

一、KVC操作OC中的KVC操作就和Java中使用反射機制去訪問類的private許可權的變數,很暴力的,這樣做就會破壞類的封裝性,本來類中的的private許可權就是不希望外界去訪問的,但是我們這樣去操作,就會反其道而行,但是我們有時候真的需要去這樣做,哎。所以說有些事不是

OC學習---的三大特性(封裝,繼承,多型)

之前的一片文章介紹了OC中類的初始化方法和點語法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天來繼續學習OC中的類的三大特性,我們在學習Java的時候都知道,類有三大特性:繼承,封

OC學習13——Foundation框架的集合

str 集合類 結構 pan sar set 體系 隊列 數組   OC集合類是一些非常有用的工具類,它可以用於存儲多個數量不等的對象,並可以實現常用的數據結構(棧、隊列等),此外,OC集合還可用於保存具有映射關系的關聯數組。OC的集合大致可以分為:NSArray、NSSe

大資料技術學習筆記hive框架基礎2-hive常用DMLUDF連線介面使用

一、分割槽表的介紹及使用     -》需求:統計每一天的PV,UV,每一天分析前一天的資料         -》第一種情況:每天的日誌儲存在同一個目錄中     &nbs

JavaWeb學習----Tomcat配置數字證書以及網路傳輸資料的密碼學知識

今天是學習JavaWeb的第二天,我們來了解什麼呢?就瞭解一下Tomcat中配置數字證書的相關內容,但是在說這部分內容的時候,我們貌似得先說一下數字證書的相關概念,那說到數字證書的時候我們還得了解一些

大資料學習筆記——Java集合框架(ArrayList)

Java集合框架學習筆記 1. Java集合框架中各介面或子類的繼承以及實現關係圖:   2. 陣列和集合類的區別整理: 陣列: 1. 長度是固定的 2. 既可以存放基本資料型別又可以存放引用資料型別 3. 存放進陣列的必須是相同型別的資料 VS 集合類: 1. 長度是可變的 2. 只能存放物件的

OC學習小結ios運行過程詳解

for cat 用戶 with res nbsp c學習 launch cati 1)ios核心類 UIView 視圖,屏幕上能看得見的東西都是視圖,例如:按鈕、文本標簽、和表格等 UIViewController:內部默認有個視圖(UIView),負責管理UIView的

【深度學習】--神經網絡的調優

flow 初始 clas 根據 叠代 pan 容易 組合 語音 一、前述 調優對於模型訓練速度,準確率方面至關重要,所以本文對神經網絡中的調優做一個總結。 二、神經網絡超參數調優 1、適當調整隱藏層數對於許多問題,你可以開始只用一個隱藏層,就可以獲得不錯的結果,比如對於復雜

Django學習(web框架的由來)

httpd return 出現 acc IT outer AI pytho 定義 Python的WEB框架有 Django、Tornado、Flask 等多種 ,Django相較與其他WEB框架其優勢為: 大而全,框架本身集成了ORM、模型綁定、模板引擎、緩存、Sessio

Python+Appium學習WebView處理

tomat sha view源碼 cti contexts and not code acc 1.認識WebView 實例說明: 當你打開百度閱讀APP→VIP全站去廣告→用自帶的 UI Automator去定位裏面的元素,如圖: 不管你去定位 ‘規則詳情‘ ‘開通‘

Python爬蟲從入門到放棄 Scrapy框架Download Middleware用法

sta 頻繁 space raw 處理 們的 img ear 法則 這篇文章中寫了常用的下載中間件的用法和例子。Downloader Middleware處理的過程主要在調度器發送requests請求的時候以及網頁將response結果返回給spiders的時候,所以從