欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

可变和不可变数组

程序员文章站 2022-06-14 18:56:11
...

1、NSArray:不可变数组 
(1)基本知识 
a、元素索引与C语言一样从0开始; 
b、数组可以存放不同类的对象也可以存放同一类的对象;(C只能同类型) 
c、只能存放OC对象,不能存放非OC对象(int,double,enum,struct等),不能存放nil,nil被用于标识数组的结束; 
d、不可变数组,一旦创建,不能添加、删除或修改其中的元素;

(2)NSArray的生成和初始化 
较常见的方法:

MusicPlayer *player = [[MusicPlayer alloc] init];
 NSArray *array1 = [NSArray array];                              //创建空数组,一般在可变数组中用的多;
 NSArray *array2 = [NSArray arrayWithObject:@"obj1"];            //创建一个元素
 NSArray *array3 = [NSArray arrayWithObjects:@1,@"obj2",player, nil];   
//创建多个元素,nil表数组结束
 NSArray *array4 = [NSArray arrayWithArray:array3];              //利用已有数组来返回一个新的数组
 NSArray *arrayNew = @[@"obj1",@2,player];                       //编译器新特征,Xcode4.4以后的新语法,不用以nil结尾

 NSLog(@"%@",array4);    
 //会调用description方法,把数组中的各个元素打印出来

output:

 (
 1,
 obj2,
 "<MusicPlayer: 0x100206850>"
 )

(2)访问数组元素

 - (NSUInteger)count;  
 //返回数组元素个数

 - (NSUInteger)indexOfObject:(id)anObject;  
 //找到与anObject相等的元素,返回元素位置,否则返回NSNotFound

 - (BOOL)containsObject:(id)anObject;       
 //是否包含anObject元素

 - (id)lastObject;     
 //返回数组最后一个元素,若接受者为空,返回nil

 - (id)objectAtIndex:(NSUInteger)index;      
 //返回index位置的元素,若index超过数组长度,会触发异常NSRangeException

 - (NSArray *)subarrayWithRange:(NSRange)range;   
 //抽取原数组一部分生成新数组
 //新语法,类似C语言数组形式
 直接用array[0]的形式访问第一个元素,下标0开始计数

 NSLog(@"%lu",[array4 count]);
 if ([array4 indexOfObject:@1] != NSNotFound) {
     NSLog(@"元素序列为:%lu",[array4 indexOfObject:@1]);
 }
 else {
     NSLog(@"没找到");
 }
 if ([array4 containsObject:@"obj2"]) {
     NSLog(@"包含该元素");
 }
 else {
     NSLog(@"不包含该元素");
 }
 NSLog(@"%@",[array4 lastObject]);
 NSLog(@"%@",[array4 objectAtIndex:1]);
 NSLog(@"数组第二个元素是:%@",array4[1]);

output:

 3
 元素序列为:0
 包含该元素
 <MusicPlayer: 0x100113db0>
 obj2
 数组第二个元素是:obj2

(3)比较

 - (BOOL)isEqualToArray:(NSArray *)otherArray;
 //元素个数相同且相同索引位置的元素也要相等才返回YES
 - (id)firstObjectCommonWithArray:(NSArray *)otherArray;
 //返回两数组第一个相同的元素,无相同,返回nil

(4)为数组添加元素

 - (NSArray *)arrayByAddingObject:(id)anObject;
 //返回新数组,anObject加在后面
 - (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray;
 //返回新数组,otherArray加在后面

(5)字符串与数组

//字符串分割的结果保存在数组中
NSString *str = @"111-222-333";
NSArray *array5 = [str componentsSeparatedByString:@"-"];
NSLog(@"%@", array5);

output:

 (
 111,
 222,
 333
 )
 - (NSString *)componentsJoinedByString:(NSString *)separator;
 //返回一个临时字符串,字符串以@"separator"的内容连接数组每个元素执行description的结果
 NSLog(@"%@",[array4 componentsJoinedByString:@"!!!"]);

output:

 1!!!obj2!!!<MusicPlayer: 0x100111b10>

(6)关于数组的内容方法还有很多,列举不完的,所以这里只是列举部分常见常用的方法。



2、NSMutableArray:可变数组 
(1)基本知识 
a、NSMutableArray是NSArray的子类,NSArray的所有方法都可以用; 
b、可变数组,存储空间是动态的,可以随意添加或删除其中的元素


(2)可变数组的初始化 
可以指定初始化一个长度为numItems的可变数组,也可以使用array方法创建长度为0的可变数组,而后添加。

 + (instancetype)arrayWithCapacity:(NSUInteger)numItems; //便利构造器
 NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:5];
 - (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER;
 NSMutableArray *mutableArray1 = [[NSMutableArray alloc] initWithCapacity:5];

(3)追加或替换元素 
追加

 - (void)addObject:(id)anObject;                    
 //添加anObject元素在数组末尾,不可为nil
 - (void)addObjectsFromArray:(NSArray *)otherArray; 
 //将otherArray的元素添加到数组的末尾
 - (void)insertObject:(id)anObject atIndex:(NSUInteger)index;   
 //将anObject添加到index位置,后面的元素顺次后移,index必须在0和数组范围之间

替换

 - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;    
//用anObject替换在index的元素,index超过数组范围,返回NSRangeException
 - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray;   
//使用otherArray的元素替换当前数组range返回的元素
 - (void)setArray:(NSArray *)otherArray;           
//用otherArray的元素替换当前数组的所有元素,当前数组的所有元素都被删除
 - (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2; 
//交换idx1和idx2位置的元素

(4)删除数组中的额元素

- (void)removeAllObjects;                                  //数组置空
 - (void)removeLastObject;                                  //删除数组最后一个元素
 - (void)removeObjectAtIndex:(NSUInteger)index;             //删除index位置上的元素
 - (void)removeObjectsInRange:(NSRange)range;               //删除range范围的元素
 - (void)removeObject:(id)anObject;                         //删除数组中所有与anObject相等的元素
 - (void)removeObjectsInArray:(NSArray *)otherArray;       //从当前数组中删除otherArray数组中包含的所有元素
 

注明:本文章属于转载,仅供行业人员学习交流使用,文章版权属于原创作者,在此向原创者致敬,感谢原创作者为大家学习交流提供精品内容。如有侵权,请联系我,我看到后第一时间删除