系列:iOS開發-NSArray

系列:iOS開發-NSArray

忙了一上午,解決了幾個bug,現在終于抽出來一點時間喝點水休息下,
想著系列這么浩大的一個工程,才剛剛開始寫,不能斷了,就跟寫小說一樣,既然是系列,那么就需要不停更...
好吧.
簡單的說說iOS開發中的數組-NSArray

首先
OC的數組比C++,Java的數組強大在于,NSArray保存的對象可以是不同的對象。但只能保存對象,int ,char,double等基本數據類型不能直接保存,需要通過轉換成對象才能加入數組。
類似于之前說的字符串一樣,OC的數組也有兩種,可變數組和不可變數組
一步一步來,
首先是NSArray的創建
我們可以從NSArray的類里面看到很多類方法的創建和實例方法的創建

@interface NSArray<ObjectType> (NSArrayCreation)

+ (instancetype)array;
+ (instancetype)arrayWithObject:(ObjectType)anObject;
+ (instancetype)arrayWithObjects:(const ObjectType [])objects count:(NSUInteger)cnt;
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;

- (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;

+ (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
- (nullable NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
- (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;

@end

我們仿照著之前NSString的方式,隨便列舉一些例子看看,

        //init
        NSArray *arr1 = [[NSArray alloc]init];
        NSLog(@"%@",arr1);
        
        //array
        NSArray *arr2 = [NSArray array];
        NSLog(@"%@",arr2);
        
        //arrayWithObject
        NSArray *arr3 = [NSArray arrayWithObject:@"arr3"];
        NSLog(@"%@",arr3);
        
        //arrayWithObjects:
        NSArray *arr4 = [NSArray arrayWithObjects:@"arr4",@"arr4", nil];
        NSLog(@"%@",arr4);
        
        NSArray *arr5 = @[@"arr5",@"arr5",@"arr5",@"arr5",@"arr5"];
        NSLog(@"%@",arr5);
        
        //initWithObjects:
        NSArray *arr6 = [[NSArray alloc]initWithObjects:@"arr6",@"arr6", nil];
        NSLog(@"%@",arr6);
        
        //arrayWithArray:
        NSArray *arr7 = [NSArray arrayWithArray:arr6];
        NSLog(@"%@",arr7);

當然創建的方式不單單這些,比如從文件里面讀取數組,網絡訪問返回的數組...
這些都在具體的例子中再對應創建...

接下來再說說NSArray的一些常用方法.

        //常用方法
        //count  (讀取數組元素個數)
        NSLog(@"%ld",[arr7 count]);
        
        //objectAtIndex:  (讀取下標對應的元素,,,也可以用[]  C的方式直接讀取)
        NSLog(@"%@,%@",[arr7 objectAtIndex:0],arr7[0]);
        
        //arrayByAddingObject:  (追加一個元素,返回新的數組)
        NSArray *arr8 = [arr7 arrayByAddingObject:@"arr8"];
        NSLog(@"%@",arr8);
        
        //arrayByAddingObjectsFromArray:   (追加多個元素,返回新的數組)
        NSArray *arr9 = [arr8 arrayByAddingObjectsFromArray:arr7];
        NSLog(@"%@",arr9);
        
        //componentsJoinedByString:   (使用某字符串合并數組元素成一個新的字符串)
        NSLog(@"%@",[arr9 componentsJoinedByString:@"-"]);
        
        //containsObject:  (數組中是否有某元素)
        NSLog(@"%d",[arr9 containsObject:@"arr9"]);
        
        //indexOfObject   (某元素對應的下標)
        NSLog(@"%ld",[arr9 indexOfObject:@"arr8"]);
        
        //indexOfObject:inRange:  (對應范圍內的某元素的下標)
        NSLog(@"%ld",[arr9 indexOfObject:@"arr8" inRange:NSMakeRange(0, arr9.count)]);
        
        //isEqualToArray:    (兩個數組是否相等)
        NSLog(@"%d",[arr9 isEqualToArray:arr8]);
        
        //firstObject  (第一個元素)
        NSLog(@"%@",[arr9 firstObject]);
        
        //lastObject  (最后一個元素)
        NSLog(@"%@",[arr9 lastObject]);
        
        //objectsAtIndexes  (對應的多個下標的多個元素)
        NSLog(@"%@",[arr9 objectsAtIndexes:[NSIndexSet indexSetWithIndex:1]]);
        
        //數組遍歷
        //for循環
        for (int i = 0; i<arr9.count; i++) {
            NSLog(@"%@",arr9[i]);
        }
        
        //for in
        for (id obj in arr9) {
            NSLog(@"%@",obj);
        }
        
        //迭代器
        NSEnumerator *enumerator = [arr9 objectEnumerator];
        id obj = nil;
        while(obj = [enumerator nextObject]){
            NSLog(@"%@",obj);
        }
        
        //block
        [arr9 enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"%ld-%@",idx,obj);
            //若終斷循環
            //*stop = YES;
        }];

當然以上的方法都是一些基礎的方法,經常會在項目中使用的方法..還有些不常用的和系統沒有提供的需要在平時開發中再做積累,
當然我剛剛也說了數組的遍歷,上面也舉例了幾個,后期我會單獨對其進行分析,比較各自的優缺點和性能.這里暫不描述

接下來學習的是NSArray的子類 可變數組NSMutableArray
還是類似的學習方式,創建+常用方法
首先是創建

        //init
        NSMutableArray *arr10 = [[NSMutableArray alloc]init];
        NSLog(@"%@",arr10);
        
        //array
        NSMutableArray *arr11 = [NSMutableArray array];
        NSLog(@"%@",arr11);
        
        //arrayWithCapacity:  (創建初始長度為多少的數組,但因為其實可變數組,所以即使長度不夠什么的,也沒有關系,比如可以設0)
        NSMutableArray *arr12 = [NSMutableArray arrayWithCapacity:0];
        NSLog(@"%@",arr12);
        
        //initWithCapacity:
        NSMutableArray *arr13 = [[NSMutableArray alloc]initWithCapacity:0];
        NSLog(@"%@",arr13);

當然因為其作為NSArray的子類,所以NSArray創建的方式,它也都有
這里就不一一舉例了

常用方法:

        //addObject:  (添加一個元素)
        [arr13 addObject:@"arr13"];
        NSLog(@"%@",arr13);
        
        //addObjectsFromArray:   (添加一組元素)
        [arr13 addObjectsFromArray:arr9];
        NSLog(@"%@",arr13);
        
        //insertObject:atIndex  (在某下標插入某一個元素)
        [arr13 insertObject:@"arr" atIndex:0];
        NSLog(@"%@",arr13);
        
        //removeLastObject   (刪除最后一個元素)
        [arr13 removeLastObject];
        NSLog(@"%@",arr13);
        
        //removeObjectAtIndex:  (刪除某下標對應的元素)
        [arr13 removeObjectAtIndex:0];
        NSLog(@"%@",arr13);
        
        //replaceObjectAtIndex:withObject   (替換某下標的元素)
        [arr13 replaceObjectAtIndex:0 withObject:@"index"];
        NSLog(@"%@",arr13);
        
        //exchangeObjectAtIndex:withObjectAtIndex:   (替換兩個下標對應元素)
        [arr13 exchangeObjectAtIndex:0 withObjectAtIndex:1];
        NSLog(@"%@",arr13);
        
        //removeAllObjects    (移除所有元素)
        [arr13 removeAllObjects];
        NSLog(@"%@",arr13);
        
        [arr13 addObjectsFromArray:arr9];
        
        //removeObject:inRange:  (移除某范圍內指定元素)
        [arr13 removeObject:@"arr" inRange:NSMakeRange(0, 1)];
        NSLog(@"%@",arr13);
        
        //removeObject:   (移除指定元素)
        [arr13 removeObject:@"arr8"];
        NSLog(@"%@",arr13);
        
        //removeObjectsInArray:   (刪除某數組內存在的元素)
        [arr13 removeObjectsInArray:arr7];
        NSLog(@"%@",arr13);
        
        //removeObjectsInRange:  (刪除指定范圍內的元素)
        [arr13 removeObjectsInRange:NSMakeRange(0, 1)];
        NSLog(@"%@",arr13);
        
        //setArray:   (設置數組元素)
        [arr13 setArray:arr9];
        
        //sortUsingSelector:  (排序)
        [arr13 sortUsingSelector:@selector(compare:)];

當然還是一樣的,凡是NSAarray的方法,NSMutableArray也都是支持的,方法很多有很多沒有,需要在開發中自己積累,當然百度,谷歌...也都是方法的來源....
常用方法基本就是這些,其實復雜的,特殊需求的方法絕大多數也是基于這些演變而來...

至于上面也有說道排序,
大家都學過C語言,肯定都能脫口而出冒泡\選擇\插入...
當然OC中也是有排序的方法的,sortUsingSelector: sortUsingComparator:等等,后續也會單獨舉例...

今天就到這里..
接下來講的是key-value 也就是OC中的NSDictionary...
我想大家也都知道了 可變,不可變.....

Demo地址:https://github.com/spicyShrimp/DEMO_OC

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • 設計模式是什么? 你知道哪些設計模式,并簡要敘述?設計模式是一種編碼經驗,就是用比較成熟的邏輯去處理某一種類型的事...
    irenb閱讀 5,265評論 1 21
  • 設計模式是什么? 你知道哪些設計模式,并簡要敘述? 設計模式是一種編碼經驗,就是用比較成熟的邏輯去處理某一種類型的...
    Jt_Self閱讀 772評論 0 4
  • 前言 上一篇簡單介紹了一下通過運行時添加方法。這篇文章呢,側重于方法的hook。 Method Swizzling...
    SHUTUP閱讀 398評論 0 1
  • 說起外公,我放暑假的時候,總是會遇到外婆和外公兩人找一個蒲團,一起面對面下跳棋,我在旁邊看,兩人的水平簡直不分上下...
    玫瑰西海岸閱讀 196評論 0 1