Object C學習筆記11-陣列

賀臣發表於2014-03-07

 

  在Object C也提供了類似C#中的Array陣列物件,在Object C中使用NSArray 來建立陣列;但是在Object C中NSArray 只能存放物件型別的指標,不能存放int,char,double等基本資料型別。

  一. 不可變陣列物件

    這個和之前的NSString有些類似,NSArray 能夠建立不可變的陣列物件。一旦初始化這個物件就不能動態的修改和增加這個陣列。

    (1)使用arrayWithObjects來初始化陣列內容,參考如下程式碼:

NSArray *items=[NSArray arrayWithObjects:@"abc",@"cdf"];

    上面初始化了一個items陣列物件,但是值得注意的是,這段程式碼會報錯,在Object C中陣列物件的建立有個特殊的地方,就是最後一個元素必須是nil,這意味著使用nil來標識陣列物件的結束。正確的方式如下:

NSArray *items=[NSArray arrayWithObjects:@"abc",@"cdf",nil];

    (2)可以使用count方法來獲取陣列的長度

NSArray *items=[NSArray arrayWithObjects:@"abc",@"cdf",nil];
NSLog(@"%d",[items count]);

    以上程式碼得到的值是2,還是3呢,一般人都會認為是3,但是這個陣列的長度是2,上面已經提過了nil只是作為一個結束識別符號,並不能代表素組內容。現在修改程式碼如下:

NSArray *items=[NSArray arrayWithObjects:@"abc",@"cdf",nil,nil];
NSLog(@"%d",[items count]);

    得到的陣列長度仍然為2,在第一個nil的位置就已經標識陣列結束了,所以後面出現再多的陣列元素都沒有作用。

    (3)使用objectAtIndex來獲取某個索引位置的陣列元素

NSLog(@"%@",[items objectAtIndex:0]);

    以上程式碼可以獲得素組物件items索引位置為0的元素,但是一定要注意陣列的長度,否則陣列越界異常。

    (4)使用for來遍歷陣列元素

for(int i=0;i<[items count];i++){
            NSLog(@"%@",[items objectAtIndex:i]);
}

    以上程式碼和我們平時使用遍歷陣列的方式無異,基本都是這種情況。但是for還有另外一種使用方式,和C#中的foreach使用方式一樣。

for(NSObject *item in items){
            NSLog(@"%@",item);
}

  

  二. 動態陣列

    (1)根據上面所描述的,大致可以猜得出來動態陣列類,和NSMutableString比較類似。我們使用NSMutableArray來定義一個動態陣列。而且NSMutableArray 還提供了一些方法動態像陣列中新增元素,在NSMutableArray不用擔心在新增元素的時候發生陣列越界的問題,當NSMutableArray長度被佔滿之後會自動擴容。

NSMutableArray *mutItems=[NSMutableArray arrayWithCapacity:2];

    我們使用arrayWithCapacity來定義一個陣列的容量。

    (2)可以使用addObject方法來向物件陣列中新增元素,而且NSMutableArray和NSArray不一樣,不需要使用nil來介紹標識陣列結束。NSMutableArray中同樣提供了count 方法來獲取陣列的長度,這裡需要注意的是count和capacity 是不一樣的,count是獲取的實際長度,而capacity是可存放的長度。

NSMutableArray *mutItems=[NSMutableArray arrayWithCapacity:12];
[mutItems addObject:@"abc"];
[mutItems addObject:@"def"];
NSLog(@"%d",[mutItems count]);

    如果往muItems中繼續新增元素,直到超過12個,muItems也不會報錯,而且count也會大於12,這也是NSMutableArray的優勢所在。

    (3)使用insertObject 在特定的位置新增元素

NSMutableArray *mutItems=[NSMutableArray arrayWithCapacity:2];
        [mutItems addObject:@"abc"];
        [mutItems addObject:@"def"];
        [mutItems addObject:@"45454"];
        NSLog(@"%d",[mutItems count]);
        
        [mutItems insertObject:@"wang" atIndex:1];
        for (NSString *item in mutItems) {
            NSLog(@"%@",item);
        }
案例

    (4)刪除陣列中的元素

    - (void)removeObject:(id)anObject inRange:(NSRange)range;設定在一定範圍內刪除,如果在這個範圍內沒有匹配的元素則什麼都不刪除。

    - (void)removeObject:(id)anObject;刪除指定元素

    - (void)removeObjectsInArray:(NSArray *)otherArray;刪除陣列中指定的元素

    - (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;刪除指定索引位置的元素

NSRange range=NSMakeRange(0, 2);
[mutItems removeObject:@"wang" inRange:range];
for (NSString *item in mutItems) {
    NSLog(@"----- %@",item);
}

    (5)替換陣列元素內容

    - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject; 可以使用這個方法來替換某個索引位置的元素

[mutItems replaceObjectAtIndex:1 withObject:@"FFFFFFFFFFFFFF"];
        for(NSString *item in mutItems){
            NSLog(@"************ %@",item);
        }

    

  本文只是很初略的記錄了學習的一些常用方法,NSArray和NSMutableArray 還提供了大量的其他方法,仍有待繼續努力學習和使用!        

相關文章