Objective C 中除了可以使用C中的基本数组外,如 int[5];,char word[] = {‘a’, ‘b’, ‘c’};,Foundation 还提供了 NSArray 类。Foundation 是有序的对象集合。NSArray 保存的对象可以是 不同的对象。但只能保存对象,int,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。
例如下面的代码在运行时会报错:
1 NSArray *arrs = [[NSArray alloc]initWithObjects:@”abc”,@”123″,456,nil];
就像 NSString 和 NSMutableString 一样,同样也存在可变数组和不可变数组。不可变数组是由 NSArray 类处理的,而可变数组则是由 NSMutableArrray 处理的。后者是前者的子类,也就是说 NSMutableArrray 继承了 NSArray 的方法。
NSArray 不可变数组
常用方法如下:
+(id)arrayWithObjects:obj1,obj2,…nil | 创建一个新的数组,obj1,obj2……是他的元素对象,以nil对象结尾 |
-(BOOL)containsObject:obj | 确定数组中是否包含对象obj |
-(NSUInteger)count | 返回数组元素个数 |
-(NSUInteger)indexOfObject:obj | 第一个包含obj元素的索引号 |
-(id)objectAtIndex;i | 返回存储在位置 i 的对象 |
-(void)makeObjectsPerformSelector:(SEL)selector | 将 selector 只是的消息发送给数组中的每个元素 |
-(NSArray*)sortedArrayUsingSelector:(SEL)selector | 根据selector 指示的比较方法对数组进行排序 |
-(BOOL)writeToFile:path atomically:(BOOL)flag | 将数组写入指定的文件中,如果 flag 为 YES,则需要先创建一个临时文件 |
使用NSArray关键字创建一个不可变的数组,一旦初始化完毕后这个数组的元素是不可以在动态的添加与删除。
NSArray 的类方法 arrayWithObjects: 使用一列对象作为元素创建数组,这种情况下需要按顺序列出对象并使用逗号隔开。将这个数组的最后一个值指定为nil,标记参数数组的结束。它实际上并不会存储在数组中。
[array count]:得到这个数组对象的长度。
[array objectAtIndex index]:传入数组的索引(index) 得到数据对象。
[arrayWithObjects: ...]:向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil,以标志结束。
例:创建星期的数组并遍历
1 int main (int argc,const char * argv[]) 2 { 3 4 @autoreleasepool{ 5 6 //创建一个包含星期的数组 7 NSArray * days = [NSArray arrayWithObjects: @"SUN", @"MON", @"TUE", @"WED", @"THU", @"FRI", @"SAT", nil]; 8 9 //获取数组所包含对象个数 10 NSLog(@"size of days:%ld", (unsigned long)[days count]); //size of days:7 11 12 //循环打印数组中的元素 13 for(int i = 0; i < [days count]; i++){ 14 NSLog(@"%@",[days objectAtIndex: i]); 15 } 16 17 //另一种方法打印数组中的元素 18 for(id day in days){ 19 NSLog(@"%@", day); 20 } 21 22 } 23 24 return 0; 25 }
上面我们使用了两种方法遍历数组中的元素,第一种方式比较普遍,但是效率不好 ,推荐使用第二种方式.
MSMutableArray 可变数组
大多时候我们需要动态的增加和删除数组中的元素,这就需要使用 MSMutableArray。
1 int main(int argc,const char * argv[]) 2 { 3 4 @autoreleasepool{ 5 6 //创建一个空数组 7 NSMutableArray * arrs = [NSMutableArray array]; 8 9 //C中的一些基本元素我们可以用NSNumber类来包装,另外还有一些struct类型的数据我们也可以用NSNumber类的父类NSValue来进行包装,包装成NSValue的对象再将其放入数组中。 10 int age = 23; 11 char c = ‘a‘; 12 float f = 3.1415926; 13 NSRect rect = NSMakeRect(1,2,3,4); 14 15 NSNumber * objAge = [NSNumber numberWithInt: age]; 16 NSNumber * objC = [NSNumber numberWithChar: c]; 17 NSNumber * objF = [NSNumber numberWithFloat: f]; 18 NSValue * objRect = [NSValue valueWithRect: rect]; 19 20 [arrs addObject: objAge]; 21 [arrs addObject: objC]; 22 [arrs addObject: objF]; 23 [arrs addObject: objRect]; 24 25 //如果要添加空的话可以用以下方法 26 [arrs addObject: [NSNull null]]; 27 28 NSLog(@"Size of arrs: %li", (unsigned long)[arrs count]);//Size of arrs: 5 29 NSLog(@"%@",arrs); 30 31 //创建一个指定初始容量的数组 32 NSMutableArray * arrs2 = [NSMutableArray arrayWithCapacity: 3]; 33 34 //指定初始容量为3,但我们添加了5个对象 35 [arrs2 addObject: @"obj1"]; 36 [arrs2 addObject: @"obj2"]; 37 [arrs2 addObject: @"obj3"]; 38 [arrs2 addObject: @"obj4"]; 39 [arrs2 addObject: @"obj5"]; 40 41 //将对象 obj 插入到索引为 i 的位置 42 [arrs2 insertObject: @"obj" atIndex: 0]; 43 44 //删除指定索引处的对象 45 [arrs2 removeObjectAtIndex: 3]; 46 47 //遍历数组 48 for (id obj in arrs2){ 49 NSLog(@"%@", obj); //obj,obj1,obj2,obj4,obj5 50 } 51 52 //合并字符串数组 53 NSString * str = [arrs2 componentsJoinedByString: @"|"]; 54 NSLog(@"%@", str); //obj|obj1|obj2|obj4|obj5 55 56 //字符串切割成数组 57 NSArray * arr3 = [str componentsSeparatedByString: @"|"]; 58 NSLog(@"%@", arr3); 59 60 } 61 62 return 0; 63 }
NSMutableArray 类常用方法
+array | 创建一个空数组 |
+(id)arrayWithCapacity:size | 创建一个数组,指定容量为size |
-(id)initWithCapacity:size | 初始化一个新分配的数组,指定容量为size |
-(void)addObject:obj | 将对象obj添加到数组末尾 |
-(void)insertObject:obj atIndex:i | 将对象 obj 插入到索引为 i 的位置 |
-(void)replaceObject:obj atIndex:i | 将数组中索引为 i 处的元素用obj 置换 |
-(void)removeObject:obj | 从数组中删除所有是 obj 的对象 |
-(void)removeObjectAtIndex:i | 从数组中删除索引为 i 的对像 |
-(void)sortUsingSelector:(SEL)selector | 用 selector 只是的比较方法将数组排序 |