Objective-C中除了可以使用C中的基本数组外,如int[5],char word[] ={‘a’,’b’,’c’};Foundation还提供了NSArray类,其有如下特点:。
(1)NSArray是有序的对象集合。
(2)NSArray保存的对象可以是不同的对象。
(3)int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。
例如下面的代码在运行时会报错:
NSArray *arrs = [[NSArray alloc]initWithObjects:@”abc”,@”123”,456,nil];
就像NSString和NSMutableString一样,同样也存在可变数组和不可变数组.不可变数组是由NSArray类处理的,而可变数组则是由NSMutableArrray处理的.后者是前者的子类,也就是说NSMutableArrray继承了NSArray的方法.
NSArray 不可变数组
使用NSArray关键字创建一个不可变的数组,一旦初始化完毕后这个数组的元素是不可以在动态的添加与删除。例如:
int main(int argc, const char * argv[])
{
//创建一个包含星期的数组
NSArray *days = [NSArray arrayWithObjects:@"SUN",
@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT", nil];
//获取数组所包含对象个数
NSLog(@"size of days:%ld",(unsigned long)[days count]); //size of days:7
//循环打印数组中的元素,比较普遍,但效率不高
for (int i=0; i<[days count]; i++) {
NSLog(@"%@",[days objectAtIndex:i]);
}
//另一种方法打印数组中的元素,效率高,推荐使用
for(id day in days){
NSLog(@"%@",day);
}
}
return 0;
}
对于数组创建,编译器为了减少代码量,提供了更简便方法,比如:
NSArray *days = [NSArray arrayWithObjects:@"SUN",
@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT", nil];
等价于:
NSArray *days =
@[@"SUN","MON","TUE","WED","THU","FRI","SAT"];
创建多维NSArray:
NSArray *days = @{
@{@”sum,@”mon”,@”tue”,@”wed”},
@{@”sum,@”mon”,@”tue”,@”fri”}
@{@”fri,@”mon”,@”tue”,@”sat”}
@{@”sat,@”mon”,@”tue”,@”wed”}
}
NSArray的类方法arrayWithObjects:使用一列对象作为元素创建数组,这种情况下需要按顺序列出对象并使用逗号隔开。将这个数组的最后一个值指定为nil,标记参数数组的结束.它实际上并不会存储在数组中.
[array count] : 得到这个数组对象的长度。
[array objectAtIndex index]: 传入数组的索引(index) 得到数据对象。
[arrayWithObjects: …] :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil,以标志结束.
+(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 指示的比较方法对数组进行排序,比如:
NSArray * array = @[@"b",@"d",@"a",@"z"];
array = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"排序后 array %@",array);
-(BOOL)writeToFile:path atomically:(BOOL)flag 将数组写入指定的文件中,如果flag 为 YES,则需要先创建一个临时文件
MSMutableArray可变数组
大多时候我们需要动态的增加和删除数组中的元素,这就需要使用MSMutableArray。例如:
int main(int argc, const char * argv[])
{
@autoreleasepool {
//创建一个空数组
NSMutableArray *arrs = [NSMutableArray array];
//C中的一些基本元素我们可以用NSNumber类来包装,类似java中的装箱,另外还有一些struct类型的数据我们也可以用NSNumber类的父类NSValue来进行包装,包装成NSValue的对象再将其放入数组中。
int age=23;
char c='a';
float f=3.1415926;
NSRect rect =NSMakeRect(1, 2, 3, 4);
NSNumber *objAge = [NSNumber numberWithInt:age];
NSNumber *objC =[NSNumber numberWithChar:c];
NSNumber *objF =[NSNumber numberWithFloat:f];
NSValue *objRect = [NSValue valueWithRect:rect];
[arrs addObject:objAge];
[arrs addObject:objC];
[arrs addObject:objF];
[arrs addObject:objRect];
//如果要添加空的话可以用以下方法
[arrs addObject:[NSNull null]];
NSLog(@"Size of arrs: %li",(unsigned long)[arrs count]); //Size of arrs: 5
NSLog(@"%@",arrs);
//创建一个指定初始容量的数组
NSMutableArray *arrs2 =
[NSMutableArray arrayWithCapacity:3];
//指定初始容量为3,但我们添加了5个对象
[arrs2 addObject:@"obj1"];
[arrs2 addObject:@"obj2"];
[arrs2 addObject:@"obj3"];
[arrs2 addObject:@"obj4"];
[arrs2 addObject:@"obj5"];
//将对象 obj 插入到索引为 i 的位置
[arrs2 insertObject:@"obj" atIndex:0];
//删除指定索引处的对象
[arrs2 removeObjectAtIndex:3];
//遍历数组
for(id obj in arrs2){
NSLog(@"%@",obj); //obj,obj1,obj2,obj4,obj5
}
//合并字符串数组
NSString *str = [arrs2 componentsJoinedByString:@"|"];
NSLog(@"%@",str); //obj|obj1|obj2|obj4|obj5
//字符串切割成数组
NSArray *arr3=[str componentsSeparatedByString:@"|"];
NSLog(@"%@",arr3);
}
return 0;
}
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 只是的比较方法将数组排序