oc_NSArrray 和 NSMutableArrray

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 只是的比较方法将数组排序
时间: 2024-10-13 00:24:42

oc_NSArrray 和 NSMutableArrray的相关文章

Foundation 之 NSArray/NSMutableArrray

NSArray 类 其有如下特点:. (1)NSArray 是有序的对象集合. (2)NSArray 保存的对象可以是不同的对象. (3)int ,char,double 等基本数据类型不能直接保存,需要通过转换成对象才能加入数组. 例如下面的代码在运行时会报错: NSArray *arrs = [[NSArray alloc]initWithObjects:@"abc",@"123",456,nil]; 就像 NSString 和 NSMutableString

iOS开发--漫谈内存管理(一)

1.MRC与ARC 苹果提供两种内存管理机制:一种是MRC(manual reference count),即手动引用计算:另一种是ARC(auto reference count),即自动引用计数.手动引用计,顾名思义,需要程序员主动调用retain.release等方法来管理内存,而自动引用计数方式,则是编译器在编译阶段把内存管理代码自动插入在需要手动调用的地方.这样就把程序员从复杂的管理内存的工作中解放出来,将更多精力放在实现具体的业务逻辑上.需要注意的是,ARC要在xcode4.2或者以